Mercurial > libavcodec.hg
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 } |