[FFmpeg-cvslog] avfilter/af_afir: add timeline support

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


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Sun Nov 19 21:26:00 2023 +0100| [bbdd604b9ed9566ea996514d2068c3f89c81efb6] | committer: Paul B Mahol

avfilter/af_afir: add timeline support

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

 libavfilter/af_afir.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
 libavfilter/af_afir.h |  1 +
 2 files changed, 47 insertions(+), 2 deletions(-)

diff --git a/libavfilter/af_afir.c b/libavfilter/af_afir.c
index a8c08f5d8c..a18da414e4 100644
--- a/libavfilter/af_afir.c
+++ b/libavfilter/af_afir.c
@@ -63,7 +63,28 @@ 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 (prev_selir != selir && s->loading[ch] != 0) {
+            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];
@@ -88,7 +109,28 @@ static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
             }
             break;
         case AV_SAMPLE_FMT_DBLP:
-            if (prev_selir != selir && s->loading[ch] != 0) {
+            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];
@@ -149,6 +191,7 @@ static int fir_frame(AudioFIRContext *s, AVFrame *in, AVFilterLink *outlink)
     s->in = in;
     ff_filter_execute(ctx, fir_channels, out, NULL,
                       FFMIN(outlink->ch_layout.nb_channels, ff_filter_get_nb_threads(ctx)));
+    s->prev_is_disabled = ctx->is_disabled;
 
     av_frame_free(&in);
     s->in = NULL;
@@ -762,5 +805,6 @@ const AVFilter ff_af_afir = {
     .process_command = process_command,
     .flags         = AVFILTER_FLAG_DYNAMIC_INPUTS  |
                      AVFILTER_FLAG_DYNAMIC_OUTPUTS |
+                     AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
                      AVFILTER_FLAG_SLICE_THREADS,
 };
diff --git a/libavfilter/af_afir.h b/libavfilter/af_afir.h
index 3517250299..8e4afd79c9 100644
--- a/libavfilter/af_afir.h
+++ b/libavfilter/af_afir.h
@@ -88,6 +88,7 @@ typedef struct AudioFIRContext {
     int max_offset[MAX_IR_STREAMS];
     int nb_channels;
     int one2many;
+    int prev_is_disabled;
     int *loading;
     double *ch_gain;
 



More information about the ffmpeg-cvslog mailing list