[FFmpeg-cvslog] avfilter/af_afir: refactor crossfade code

Paul B Mahol git at videolan.org
Mon Nov 20 00:56:51 EET 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sun Nov 19 23:45:19 2023 +0100| [6579d95df3d16e73735e0bf6cc5b02aaef0fb38f] | committer: Paul B Mahol

avfilter/af_afir: refactor crossfade code

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

 libavfilter/af_afir.c       | 90 +--------------------------------------------
 libavfilter/afir_template.c | 50 +++++++++++++++++++++++++
 2 files changed, 52 insertions(+), 88 deletions(-)

diff --git a/libavfilter/af_afir.c b/libavfilter/af_afir.c
index a18da414e4..7d670ddff2 100644
--- a/libavfilter/af_afir.c
+++ b/libavfilter/af_afir.c
@@ -63,96 +63,10 @@ static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
     for (int offset = 0; offset < out->nb_samples; offset += min_part_size) {
         switch (s->format) {
         case AV_SAMPLE_FMT_FLTP:
-            if (ctx->is_disabled || s->prev_is_disabled) {
-                const float *in = (const float *)s->in->extended_data[ch] + offset;
-                const float *xfade0 = (const float *)s->xfade[0]->extended_data[ch];
-                const float *xfade1 = (const float *)s->xfade[1]->extended_data[ch];
-                float *src0 = (float *)s->fadein[0]->extended_data[ch];
-                float *src1 = (float *)s->fadein[1]->extended_data[ch];
-                float *dst = ((float *)out->extended_data[ch]) + offset;
-
-                if (ctx->is_disabled && !s->prev_is_disabled) {
-                    memset(src0, 0, min_part_size * sizeof(float));
-                    fir_quantum_float(ctx, s->fadein[0], ch, offset, 0, selir);
-                    for (int n = 0; n < min_part_size; n++)
-                        dst[n] = xfade1[n] * src0[n] + xfade0[n] * in[n];
-                } else if (!ctx->is_disabled && s->prev_is_disabled) {
-                    memset(src1, 0, min_part_size * sizeof(float));
-                    fir_quantum_float(ctx, s->fadein[1], ch, offset, 0, selir);
-                    for (int n = 0; n < min_part_size; n++)
-                        dst[n] = xfade1[n] * in[n] + xfade0[n] * src1[n];
-                } else {
-                    memcpy(dst, in, sizeof(float) * min_part_size);
-                }
-            } else if (prev_selir != selir && s->loading[ch] != 0) {
-                const float *xfade0 = (const float *)s->xfade[0]->extended_data[ch];
-                const float *xfade1 = (const float *)s->xfade[1]->extended_data[ch];
-                float *src0 = (float *)s->fadein[0]->extended_data[ch];
-                float *src1 = (float *)s->fadein[1]->extended_data[ch];
-                float *dst = ((float *)out->extended_data[ch]) + offset;
-
-                memset(src0, 0, min_part_size * sizeof(float));
-                memset(src1, 0, min_part_size * sizeof(float));
-
-                fir_quantum_float(ctx, s->fadein[0], ch, offset, 0, prev_selir);
-                fir_quantum_float(ctx, s->fadein[1], ch, offset, 0, selir);
-
-                if (s->loading[ch] > s->max_offset[selir]) {
-                    for (int n = 0; n < min_part_size; n++)
-                        dst[n] = xfade1[n] * src0[n] + xfade0[n] * src1[n];
-                    s->loading[ch] = 0;
-                } else {
-                    memcpy(dst, src0, min_part_size * sizeof(float));
-                }
-            } else {
-                fir_quantum_float(ctx, out, ch, offset, offset, selir);
-            }
+            fir_quantums_float(ctx, s, out, min_part_size, ch, offset, prev_selir, selir);
             break;
         case AV_SAMPLE_FMT_DBLP:
-            if (ctx->is_disabled || s->prev_is_disabled) {
-                const double *in = (const double *)s->in->extended_data[ch] + offset;
-                const double *xfade0 = (const double *)s->xfade[0]->extended_data[ch];
-                const double *xfade1 = (const double *)s->xfade[1]->extended_data[ch];
-                double *src0 = (double *)s->fadein[0]->extended_data[ch];
-                double *src1 = (double *)s->fadein[1]->extended_data[ch];
-                double *dst = ((double *)out->extended_data[ch]) + offset;
-
-                if (ctx->is_disabled && !s->prev_is_disabled) {
-                    memset(src0, 0, min_part_size * sizeof(double));
-                    fir_quantum_double(ctx, s->fadein[0], ch, offset, 0, selir);
-                    for (int n = 0; n < min_part_size; n++)
-                        dst[n] = xfade1[n] * src0[n] + xfade0[n] * in[n];
-                } else if (!ctx->is_disabled && s->prev_is_disabled) {
-                    memset(src1, 0, min_part_size * sizeof(double));
-                    fir_quantum_double(ctx, s->fadein[1], ch, offset, 0, selir);
-                    for (int n = 0; n < min_part_size; n++)
-                        dst[n] = xfade1[n] * in[n] + xfade0[n] * src1[n];
-                } else {
-                    memcpy(dst, in, sizeof(double) * min_part_size);
-                }
-            } else if (prev_selir != selir && s->loading[ch] != 0) {
-                const double *xfade0 = (const double *)s->xfade[0]->extended_data[ch];
-                const double *xfade1 = (const double *)s->xfade[1]->extended_data[ch];
-                double *src0 = (double *)s->fadein[0]->extended_data[ch];
-                double *src1 = (double *)s->fadein[1]->extended_data[ch];
-                double *dst = ((double *)out->extended_data[ch]) + offset;
-
-                memset(src0, 0, min_part_size * sizeof(double));
-                memset(src1, 0, min_part_size * sizeof(double));
-
-                fir_quantum_double(ctx, s->fadein[0], ch, offset, 0, prev_selir);
-                fir_quantum_double(ctx, s->fadein[1], ch, offset, 0, selir);
-
-                if (s->loading[ch] > s->max_offset[selir]) {
-                    for (int n = 0; n < min_part_size; n++)
-                        dst[n] = xfade1[n] * src0[n] + xfade0[n] * src1[n];
-                    s->loading[ch] = 0;
-                } else {
-                    memcpy(dst, src0, min_part_size * sizeof(double));
-                }
-            } else {
-                fir_quantum_double(ctx, out, ch, offset, offset, selir);
-            }
+            fir_quantums_double(ctx, s, out, min_part_size, ch, offset, prev_selir, selir);
             break;
         }
 
diff --git a/libavfilter/afir_template.c b/libavfilter/afir_template.c
index fb7bfca168..08e1ca4692 100644
--- a/libavfilter/afir_template.c
+++ b/libavfilter/afir_template.c
@@ -242,3 +242,53 @@ static int fn(fir_quantum)(AVFilterContext *ctx, AVFrame *out, int ch, int ioffs
 
     return 0;
 }
+
+static void fn(fir_quantums)(AVFilterContext *ctx, AudioFIRContext *s, AVFrame *out,
+                             int min_part_size, int ch, int offset,
+                             int prev_selir, int selir)
+{
+    if (ctx->is_disabled || s->prev_is_disabled) {
+        const ftype *in = (const ftype *)s->in->extended_data[ch] + offset;
+        const ftype *xfade0 = (const ftype *)s->xfade[0]->extended_data[ch];
+        const ftype *xfade1 = (const ftype *)s->xfade[1]->extended_data[ch];
+        ftype *src0 = (ftype *)s->fadein[0]->extended_data[ch];
+        ftype *src1 = (ftype *)s->fadein[1]->extended_data[ch];
+        ftype *dst = ((ftype *)out->extended_data[ch]) + offset;
+
+        if (ctx->is_disabled && !s->prev_is_disabled) {
+            memset(src0, 0, min_part_size * sizeof(ftype));
+            fn(fir_quantum)(ctx, s->fadein[0], ch, offset, 0, selir);
+            for (int n = 0; n < min_part_size; n++)
+                dst[n] = xfade1[n] * src0[n] + xfade0[n] * in[n];
+        } else if (!ctx->is_disabled && s->prev_is_disabled) {
+            memset(src1, 0, min_part_size * sizeof(ftype));
+            fn(fir_quantum)(ctx, s->fadein[1], ch, offset, 0, selir);
+            for (int n = 0; n < min_part_size; n++)
+                dst[n] = xfade1[n] * in[n] + xfade0[n] * src1[n];
+        } else {
+            memcpy(dst, in, sizeof(ftype) * min_part_size);
+        }
+    } else if (prev_selir != selir && s->loading[ch] != 0) {
+        const ftype *xfade0 = (const ftype *)s->xfade[0]->extended_data[ch];
+        const ftype *xfade1 = (const ftype *)s->xfade[1]->extended_data[ch];
+        ftype *src0 = (ftype *)s->fadein[0]->extended_data[ch];
+        ftype *src1 = (ftype *)s->fadein[1]->extended_data[ch];
+        ftype *dst = ((ftype *)out->extended_data[ch]) + offset;
+
+        memset(src0, 0, min_part_size * sizeof(ftype));
+        memset(src1, 0, min_part_size * sizeof(ftype));
+
+        fn(fir_quantum)(ctx, s->fadein[0], ch, offset, 0, prev_selir);
+        fn(fir_quantum)(ctx, s->fadein[1], ch, offset, 0, selir);
+
+        if (s->loading[ch] > s->max_offset[selir]) {
+            for (int n = 0; n < min_part_size; n++)
+                dst[n] = xfade1[n] * src0[n] + xfade0[n] * src1[n];
+            s->loading[ch] = 0;
+        } else {
+            memcpy(dst, src0, min_part_size * sizeof(ftype));
+        }
+    } else {
+        fn(fir_quantum)(ctx, out, ch, offset, offset, selir);
+    }
+}



More information about the ffmpeg-cvslog mailing list