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 }