Mercurial > libavcodec.hg
comparison smacker.c @ 3220:a931984ec6ab libavcodec
Don't use get_vlc2() when tree is one symbol. This fixes audio decoding
artifacts (chirps instead of silence).
author | kostya |
---|---|
date | Sat, 25 Mar 2006 15:37:08 +0000 |
parents | cc86ebc32143 |
children | 68721b62a528 |
comparison
equal
deleted
inserted
replaced
3219:cf233efbcece | 3220:a931984ec6ab |
---|---|
604 h[i].lengths = av_mallocz(256 * sizeof(int)); | 604 h[i].lengths = av_mallocz(256 * sizeof(int)); |
605 h[i].values = av_mallocz(256 * sizeof(int)); | 605 h[i].values = av_mallocz(256 * sizeof(int)); |
606 get_bits1(&gb); | 606 get_bits1(&gb); |
607 smacker_decode_tree(&gb, &h[i], 0, 0); | 607 smacker_decode_tree(&gb, &h[i], 0, 0); |
608 get_bits1(&gb); | 608 get_bits1(&gb); |
609 res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, | 609 if(h[i].current > 1) { |
610 res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, | |
610 h[i].lengths, sizeof(int), sizeof(int), | 611 h[i].lengths, sizeof(int), sizeof(int), |
611 h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); | 612 h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); |
612 if(res < 0) { | 613 if(res < 0) { |
613 av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); | 614 av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); |
614 return -1; | 615 return -1; |
616 } | |
615 } | 617 } |
616 } | 618 } |
617 if(bits) { //decode 16-bit data | 619 if(bits) { //decode 16-bit data |
618 pred[0] = get_bits(&gb, 8); | 620 pred[0] = get_bits(&gb, 8); |
619 pred[0] |= get_bits(&gb, 8); | 621 pred[0] |= get_bits(&gb, 8); |
622 *samples++ = pred[0]; | |
620 if(stereo) { | 623 if(stereo) { |
621 pred[1] = get_bits(&gb, 8); | 624 pred[1] = get_bits(&gb, 8); |
622 pred[1] |= get_bits(&gb, 8); | 625 pred[1] |= get_bits(&gb, 8); |
626 *samples++ = pred[1]; | |
623 } | 627 } |
624 for(i = 0; i < unp_size / 2; i++) { | 628 for(i = 0; i < unp_size / 2; i++) { |
625 if(i & stereo) { | 629 if(i & stereo) { |
626 val = h[2].values[get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3)]; | 630 if(vlc[2].table) |
627 val |= (int8_t)h[3].values[get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3)] << 8; | 631 res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3); |
628 pred[1] += val; | 632 else |
633 res = 0; | |
634 val = h[2].values[res]; | |
635 if(vlc[3].table) | |
636 res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3); | |
637 else | |
638 res = 0; | |
639 val |= h[3].values[res] << 8; | |
640 pred[1] += (int16_t)val; | |
629 *samples++ = pred[1]; | 641 *samples++ = pred[1]; |
630 } else { | 642 } else { |
631 val = h[0].values[get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3)]; | 643 if(vlc[0].table) |
632 val |= (int8_t)h[1].values[get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3)] << 8; | 644 res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); |
645 else | |
646 res = 0; | |
647 val = h[0].values[res]; | |
648 if(vlc[1].table) | |
649 res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); | |
650 else | |
651 res = 0; | |
652 val |= h[1].values[res] << 8; | |
633 pred[0] += val; | 653 pred[0] += val; |
634 *samples++ = pred[0]; | 654 *samples++ = pred[0]; |
635 } | 655 } |
636 } | 656 } |
637 } else { //8-bit data | 657 } else { //8-bit data |
638 pred[0] = get_bits(&gb, 8); | 658 pred[0] = get_bits(&gb, 8); |
639 if(stereo) | 659 *samples++ = (pred[0] - 0x80) << 8; |
660 if(stereo) { | |
640 pred[1] = get_bits(&gb, 8); | 661 pred[1] = get_bits(&gb, 8); |
662 *samples++ = (pred[1] - 0x80) << 8; | |
663 } | |
641 for(i = 0; i < unp_size; i++) { | 664 for(i = 0; i < unp_size; i++) { |
642 if(i & stereo){ | 665 if(i & stereo){ |
643 pred[1] += (int8_t)h[1].values[get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3)]; | 666 if(vlc[1].table) |
667 res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); | |
668 else | |
669 res = 0; | |
670 pred[1] += (int8_t)h[1].values[res]; | |
644 *samples++ = (pred[1] - 0x80) << 8; | 671 *samples++ = (pred[1] - 0x80) << 8; |
645 } else { | 672 } else { |
646 pred[0] += (int8_t)h[0].values[get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3)]; | 673 if(vlc[0].table) |
674 res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); | |
675 else | |
676 res = 0; | |
677 pred[0] += (int8_t)h[0].values[res]; | |
647 *samples++ = (pred[0] - 0x80) << 8; | 678 *samples++ = (pred[0] - 0x80) << 8; |
648 } | 679 } |
649 } | 680 } |
650 unp_size *= 2; | 681 unp_size *= 2; |
651 } | 682 } |