summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2023-04-23 23:54:50 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2023-05-01 00:48:32 +0200
commitb2a3279dbe1f1c6a2b9c36a6137281c828b5d0e4 (patch)
tree6cbf97b70e23a1144d2df97fe0d7f44c5d5a9140 /libavcodec
parenteb768a75f8a0b347ab0f84c2c68959f5dbde6d4b (diff)
downloadffmpeg-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')
-rw-r--r--libavcodec/apedec.c17
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 ++;