# HG changeset patch # User kostya # Date 1143301028 0 # Node ID a931984ec6ab377200bcac2528566f44ffc15de1 # Parent cf233efbceceeb02aa2757afead82fa45a25af43 Don't use get_vlc2() when tree is one symbol. This fixes audio decoding artifacts (chirps instead of silence). diff -r cf233efbcece -r a931984ec6ab smacker.c --- a/smacker.c Sat Mar 25 09:46:43 2006 +0000 +++ b/smacker.c Sat Mar 25 15:37:08 2006 +0000 @@ -606,44 +606,75 @@ get_bits1(&gb); smacker_decode_tree(&gb, &h[i], 0, 0); get_bits1(&gb); - res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, + if(h[i].current > 1) { + res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length, h[i].lengths, sizeof(int), sizeof(int), h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE); - if(res < 0) { - av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); - return -1; + if(res < 0) { + av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n"); + return -1; + } } } if(bits) { //decode 16-bit data pred[0] = get_bits(&gb, 8); pred[0] |= get_bits(&gb, 8); + *samples++ = pred[0]; if(stereo) { pred[1] = get_bits(&gb, 8); pred[1] |= get_bits(&gb, 8); + *samples++ = pred[1]; } for(i = 0; i < unp_size / 2; i++) { if(i & stereo) { - val = h[2].values[get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3)]; - val |= (int8_t)h[3].values[get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3)] << 8; - pred[1] += val; + if(vlc[2].table) + res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3); + else + res = 0; + val = h[2].values[res]; + if(vlc[3].table) + res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3); + else + res = 0; + val |= h[3].values[res] << 8; + pred[1] += (int16_t)val; *samples++ = pred[1]; } else { - val = h[0].values[get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3)]; - val |= (int8_t)h[1].values[get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3)] << 8; + if(vlc[0].table) + res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); + else + res = 0; + val = h[0].values[res]; + if(vlc[1].table) + res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); + else + res = 0; + val |= h[1].values[res] << 8; pred[0] += val; *samples++ = pred[0]; } } } else { //8-bit data pred[0] = get_bits(&gb, 8); - if(stereo) + *samples++ = (pred[0] - 0x80) << 8; + if(stereo) { pred[1] = get_bits(&gb, 8); + *samples++ = (pred[1] - 0x80) << 8; + } for(i = 0; i < unp_size; i++) { if(i & stereo){ - pred[1] += (int8_t)h[1].values[get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3)]; + if(vlc[1].table) + res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); + else + res = 0; + pred[1] += (int8_t)h[1].values[res]; *samples++ = (pred[1] - 0x80) << 8; } else { - pred[0] += (int8_t)h[0].values[get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3)]; + if(vlc[0].table) + res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); + else + res = 0; + pred[0] += (int8_t)h[0].values[res]; *samples++ = (pred[0] - 0x80) << 8; } }