diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2023-04-23 23:54:50 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2023-05-01 00:48:32 +0200 |
commit | b2a3279dbe1f1c6a2b9c36a6137281c828b5d0e4 (patch) | |
tree | 6cbf97b70e23a1144d2df97fe0d7f44c5d5a9140 /libavcodec/apedec.c | |
parent | eb768a75f8a0b347ab0f84c2c68959f5dbde6d4b (diff) | |
download | ffmpeg-b2a3279dbe1f1c6a2b9c36a6137281c828b5d0e4.tar.gz |
avcodec/apedec: Factor constant sign out of loop in long_filter_high_3800()
930 -> 850 cycles
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/apedec.c')
-rw-r--r-- | libavcodec/apedec.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 40cd78a991..772636afde 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -955,9 +955,20 @@ static void long_filter_high_3800(int32_t *buffer, int order, int shift, int len for (i = order; i < length; i++) { dotprod = 0; sign = APESIGN(buffer[i]); - for (j = 0; j < order; j++) { - dotprod += delayp[j] * (unsigned)coeffs[j]; - coeffs[j] += ((delayp[j] >> 31) | 1) * sign; + if (sign == 1) { + for (j = 0; j < order; j++) { + dotprod += delayp[j] * (unsigned)coeffs[j]; + coeffs[j] += (delayp[j] >> 31) | 1; + } + } else if (sign == -1) { + for (j = 0; j < order; j++) { + dotprod += delayp[j] * (unsigned)coeffs[j]; + coeffs[j] -= (delayp[j] >> 31) | 1; + } + } else { + for (j = 0; j < order; j++) { + dotprod += delayp[j] * (unsigned)coeffs[j]; + } } buffer[i] -= (unsigned)(dotprod >> shift); delayp ++; |