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:
Andreas Rheinhardt 2020-07-24 15:51:09 +02:00
parent b2c42f0233
commit 6ffc7be5da
1 changed files with 20 additions and 42 deletions

View File

@ -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];
}
} }
} }