[FFmpeg-cvslog] avfilter/af_acrossover: unroll biquad_process loop

Paul B Mahol git at videolan.org
Mon Nov 30 15:54:18 EET 2020


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Mon Nov 30 14:20:45 2020 +0100| [ca0900bc6ef1db42881769528f2a3bb69e0bc492] | committer: Paul B Mahol

avfilter/af_acrossover: unroll biquad_process loop

Makes code significantly faster for higher orders.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ca0900bc6ef1db42881769528f2a3bb69e0bc492
---

 libavfilter/af_acrossover.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/libavfilter/af_acrossover.c b/libavfilter/af_acrossover.c
index 7788251d3a..6150af7933 100644
--- a/libavfilter/af_acrossover.c
+++ b/libavfilter/af_acrossover.c
@@ -288,7 +288,25 @@ static void biquad_process_## name(const BiquadCoeffs *const c,\
     type z1 = b->z1;                                           \
     type z2 = b->z2;                                           \
                                                                \
-    for (int n = 0; n < nb_samples; n++) {                     \
+    for (int n = 0; n + 1 < nb_samples; n++) {                 \
+        type in = src[n];                                      \
+        type out;                                              \
+                                                               \
+        out = in * b0 + z1;                                    \
+        z1 = b1 * in + z2 + a1 * out;                          \
+        z2 = b2 * in + a2 * out;                               \
+        dst[n] = out;                                          \
+                                                               \
+        n++;                                                   \
+        in = src[n];                                           \
+        out = in * b0 + z1;                                    \
+        z1 = b1 * in + z2 + a1 * out;                          \
+        z2 = b2 * in + a2 * out;                               \
+        dst[n] = out;                                          \
+    }                                                          \
+                                                               \
+    if (nb_samples & 1) {                                      \
+        const int n = nb_samples - 1;                          \
         const type in = src[n];                                \
         type out;                                              \
                                                                \



More information about the ffmpeg-cvslog mailing list