summaryrefslogtreecommitdiff
path: root/libavcodec/smacker.c
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2006-03-25 15:37:08 +0000
committerKostya Shishkov <kostya.shishkov@gmail.com>2006-03-25 15:37:08 +0000
commit76fabb4579022b438a8d2b5a81d5431110ba9007 (patch)
treef5912e8d73a27af6d7d59468a4e8cd358e6500f7 /libavcodec/smacker.c
parent662710ed3515252312e27273a97029e5d9af8420 (diff)
Don't use get_vlc2() when tree is one symbol. This fixes audio decoding
artifacts (chirps instead of silence). Originally committed as revision 5217 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/smacker.c')
-rw-r--r--libavcodec/smacker.c55
1 files changed, 43 insertions, 12 deletions
diff --git a/libavcodec/smacker.c b/libavcodec/smacker.c
index 8842b5e5f2..7a142de1b1 100644
--- a/libavcodec/smacker.c
+++ b/libavcodec/smacker.c
@@ -606,44 +606,75 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
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;
}
}