mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/smacker: Avoid code duplication
Besides the obvious advantage of less code this also has a performance impact: For GCC 9 the time spent on one call to smka_decode_frame() for the sample from ticket #2425 decreased from 1693619 to 1498127 decicycles. For Clang 9, it decreased from 1369089 to 1366465 decicycles. Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
b2c42f0233
commit
6ffc7be5da
|
@ -671,37 +671,23 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
for(i = 0; i <= stereo; i++)
|
for(i = 0; i <= stereo; i++)
|
||||||
*samples++ = pred[i];
|
*samples++ = pred[i];
|
||||||
for(; i < unp_size / 2; i++) {
|
for(; i < unp_size / 2; i++) {
|
||||||
|
unsigned idx = 2 * (i & stereo);
|
||||||
if (get_bits_left(&gb) < 0) {
|
if (get_bits_left(&gb) < 0) {
|
||||||
ret = AVERROR_INVALIDDATA;
|
ret = AVERROR_INVALIDDATA;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if(i & stereo) {
|
if (vlc[idx].table)
|
||||||
if(vlc[2].table)
|
res = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3);
|
||||||
res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3);
|
else
|
||||||
else
|
res = values[idx];
|
||||||
res = values[2];
|
val = res;
|
||||||
val = res;
|
if (vlc[++idx].table)
|
||||||
if(vlc[3].table)
|
res = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3);
|
||||||
res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3);
|
else
|
||||||
else
|
res = values[idx];
|
||||||
res = values[3];
|
val |= res << 8;
|
||||||
val |= res << 8;
|
pred[idx / 2] += val;
|
||||||
pred[1] += val;
|
*samples++ = pred[idx / 2];
|
||||||
*samples++ = pred[1];
|
|
||||||
} else {
|
|
||||||
if(vlc[0].table)
|
|
||||||
res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3);
|
|
||||||
else
|
|
||||||
res = values[0];
|
|
||||||
val = res;
|
|
||||||
if(vlc[1].table)
|
|
||||||
res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
|
|
||||||
else
|
|
||||||
res = values[1];
|
|
||||||
val |= res << 8;
|
|
||||||
pred[0] += val;
|
|
||||||
*samples++ = pred[0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else { //8-bit data
|
} else { //8-bit data
|
||||||
for(i = stereo; i >= 0; i--)
|
for(i = stereo; i >= 0; i--)
|
||||||
|
@ -709,25 +695,17 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
for(i = 0; i <= stereo; i++)
|
for(i = 0; i <= stereo; i++)
|
||||||
*samples8++ = pred[i];
|
*samples8++ = pred[i];
|
||||||
for(; i < unp_size; i++) {
|
for(; i < unp_size; i++) {
|
||||||
|
unsigned idx = i & stereo;
|
||||||
if (get_bits_left(&gb) < 0) {
|
if (get_bits_left(&gb) < 0) {
|
||||||
ret = AVERROR_INVALIDDATA;
|
ret = AVERROR_INVALIDDATA;
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if(i & stereo){
|
if (vlc[idx].table)
|
||||||
if(vlc[1].table)
|
val = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3);
|
||||||
res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
|
else
|
||||||
else
|
val = values[idx];
|
||||||
res = values[1];
|
pred[idx] += val;
|
||||||
pred[1] += res;
|
*samples8++ = pred[idx];
|
||||||
*samples8++ = pred[1];
|
|
||||||
} else {
|
|
||||||
if(vlc[0].table)
|
|
||||||
res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3);
|
|
||||||
else
|
|
||||||
res = values[0];
|
|
||||||
pred[0] += res;
|
|
||||||
*samples8++ = pred[0];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue