comparison wma.c @ 9869:1f6b569bf958 libavcodec

Add support for escape coded wmapro run level coefficients
author faust3
date Sat, 20 Jun 2009 10:28:55 +0000
parents 5cc32c474caf
children 40638c6c2d69
comparison
equal deleted inserted replaced
9868:5cc32c474caf 9869:1f6b569bf958
424 424
425 return 0; 425 return 0;
426 } 426 }
427 427
428 /** 428 /**
429 * Decode an uncompressed coefficient.
430 * @param s codec context
431 * @return the decoded coefficient
432 */
433 unsigned int ff_wma_get_large_val(GetBitContext* gb)
434 {
435 /** consumes up to 34 bits */
436 int n_bits = 8;
437 /** decode length */
438 if (get_bits1(gb)) {
439 n_bits += 8;
440 if (get_bits1(gb)) {
441 n_bits += 8;
442 if (get_bits1(gb)) {
443 n_bits += 7;
444 }
445 }
446 }
447 return get_bits_long(gb, n_bits);
448 }
449
450 /**
429 * Decode run level compressed coefficients. 451 * Decode run level compressed coefficients.
430 * @param avctx codec context 452 * @param avctx codec context
431 * @param gb bitstream reader context 453 * @param gb bitstream reader context
432 * @param vlc vlc table for get_vlc2 454 * @param vlc vlc table for get_vlc2
433 * @param level_table level codes 455 * @param level_table level codes
448 int num_coefs, int block_len, int frame_len_bits, 470 int num_coefs, int block_len, int frame_len_bits,
449 int coef_nb_bits) 471 int coef_nb_bits)
450 { 472 {
451 int code, run, level, sign; 473 int code, run, level, sign;
452 WMACoef* eptr = ptr + num_coefs; 474 WMACoef* eptr = ptr + num_coefs;
475 ptr += offset;
453 for(;;) { 476 for(;;) {
454 code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX); 477 code = get_vlc2(gb, vlc->table, VLCBITS, VLCMAX);
455 if (code < 0) 478 if (code < 0)
456 return -1; 479 return -1;
457 if (code == 1) { 480 if (code == 1) {
458 /* EOB */ 481 /* EOB */
459 break; 482 break;
460 } else if (code == 0) { 483 } else if (code == 0) {
461 /* escape */ 484 /* escape */
485 if (!version) {
462 level = get_bits(gb, coef_nb_bits); 486 level = get_bits(gb, coef_nb_bits);
463 /* NOTE: this is rather suboptimal. reading 487 /* NOTE: this is rather suboptimal. reading
464 block_len_bits would be better */ 488 block_len_bits would be better */
465 run = get_bits(gb, frame_len_bits); 489 run = get_bits(gb, frame_len_bits);
490 } else {
491 level = ff_wma_get_large_val(gb);
492 /** escape decode */
493 if (get_bits1(gb)) {
494 if (get_bits1(gb)) {
495 if (get_bits1(gb)) {
496 av_log(avctx,AV_LOG_ERROR,
497 "broken escape sequence\n");
498 return -1;
499 } else
500 run = get_bits(gb, frame_len_bits) + 4;
501 } else
502 run = get_bits(gb, 2) + 1;
503 } else
504 run = 0;
505 }
466 } else { 506 } else {
467 /* normal code */ 507 /* normal code */
468 run = run_table[code]; 508 run = run_table[code];
469 level = level_table[code]; 509 level = level_table[code];
470 } 510 }