|
|
|
@@ -558,7 +558,6 @@ static av_cold int decode_end(AVCodecContext *avctx) |
|
|
|
|
|
|
|
static av_cold int smka_decode_init(AVCodecContext *avctx) |
|
|
|
{ |
|
|
|
avctx->sample_fmt = SAMPLE_FMT_S16; |
|
|
|
avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
@@ -572,6 +571,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
|
|
|
HuffContext h[4]; |
|
|
|
VLC vlc[4]; |
|
|
|
int16_t *samples = data; |
|
|
|
int8_t *samples8 = data; |
|
|
|
int val; |
|
|
|
int i, res; |
|
|
|
int unp_size; |
|
|
|
@@ -589,7 +589,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
|
|
|
} |
|
|
|
stereo = get_bits1(&gb); |
|
|
|
bits = get_bits1(&gb); |
|
|
|
if (unp_size & 0xC0000000 || (unp_size << !bits) > *data_size) { |
|
|
|
if (unp_size & 0xC0000000 || unp_size > *data_size) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n"); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
@@ -655,7 +655,7 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
|
|
|
for(i = stereo; i >= 0; i--) |
|
|
|
pred[i] = get_bits(&gb, 8); |
|
|
|
for(i = 0; i < stereo; i++) |
|
|
|
*samples++ = (pred[i] - 0x80) << 8; |
|
|
|
*samples8++ = pred[i]; |
|
|
|
for(i = 0; i < unp_size; i++) { |
|
|
|
if(i & stereo){ |
|
|
|
if(vlc[1].table) |
|
|
|
@@ -663,17 +663,16 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
|
|
|
else |
|
|
|
res = 0; |
|
|
|
pred[1] += (int8_t)h[1].values[res]; |
|
|
|
*samples++ = (pred[1] - 0x80) << 8; |
|
|
|
*samples8++ = pred[1]; |
|
|
|
} else { |
|
|
|
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; |
|
|
|
*samples8++ = pred[0]; |
|
|
|
} |
|
|
|
} |
|
|
|
unp_size *= 2; |
|
|
|
} |
|
|
|
|
|
|
|
for(i = 0; i < 4; i++) { |
|
|
|
|