[FFmpeg-cvslog] avfilter/af_afir: fix remaining artifacts on IR switch

Paul B Mahol git at videolan.org
Tue Apr 25 22:25:06 EEST 2023


ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Tue Apr 25 20:33:08 2023 +0200| [8b0ec740cb9f6f30b4ec3d68d5bd871760fc80f3] | committer: Paul B Mahol

avfilter/af_afir: fix remaining artifacts on IR switch

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

 libavfilter/af_afir.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/libavfilter/af_afir.c b/libavfilter/af_afir.c
index 24fb8c1abe..e2cb14aba5 100644
--- a/libavfilter/af_afir.c
+++ b/libavfilter/af_afir.c
@@ -112,7 +112,7 @@ 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) {
+            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];
@@ -125,7 +125,7 @@ static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
                 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] > 0 && s->loading[ch] <= min_part_size) {
+                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;
@@ -137,7 +137,7 @@ static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
             }
             break;
         case AV_SAMPLE_FMT_DBLP:
-            if (prev_selir != selir) {
+            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];
@@ -150,7 +150,7 @@ static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
                 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] > 0 && s->loading[ch] <= min_part_size) {
+                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;
@@ -163,8 +163,8 @@ static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
             break;
         }
 
-        if (selir != prev_selir && s->loading[ch] > 0)
-            s->loading[ch] -= min_part_size;
+        if (selir != prev_selir && s->loading[ch] != 0)
+            s->loading[ch] += min_part_size;
     }
 
     return 0;
@@ -346,11 +346,11 @@ static int convert_coeffs(AVFilterContext *ctx, int selir)
             int nb_partitions = FFMIN(step, (left + part_size - 1) / part_size);
 
             s->nb_segments[selir] = i + 1;
-            s->max_offset[selir] = offset;
             ret = init_segment(ctx, &s->seg[selir][i], selir, offset, nb_partitions, part_size, i);
             if (ret < 0)
                 return ret;
             offset += nb_partitions * part_size;
+            s->max_offset[selir] = offset;
             left -= nb_partitions * part_size;
             part_size *= 2;
             part_size = FFMIN(part_size, max_part_size);
@@ -503,18 +503,13 @@ static int activate(AVFilterContext *ctx)
         }
     }
 
-    if (s->selir != s->prev_selir && s->loading[0] <= 0) {
-        for (int ch = 0; ch < s->nb_channels; ch++)
-            s->loading[ch] = s->max_offset[s->selir] + s->max_part_size;
-    }
-
     available = ff_inlink_queued_samples(ctx->inputs[0]);
     wanted = FFMAX(s->min_part_size, (available / s->min_part_size) * s->min_part_size);
     ret = ff_inlink_consume_samples(ctx->inputs[0], wanted, wanted, &in);
     if (ret > 0)
         ret = fir_frame(s, in, outlink);
 
-    if (s->selir != s->prev_selir && s->loading[0] <= 0)
+    if (s->selir != s->prev_selir && s->loading[0] == 0)
         s->prev_selir = s->selir;
 
     if (ret < 0)
@@ -799,9 +794,13 @@ static int process_command(AVFilterContext *ctx,
         return ret;
 
     s->selir = FFMIN(s->nb_irs - 1, s->selir);
-    if (s->selir != prev_selir)
+    if (s->selir != prev_selir) {
         s->prev_selir = prev_selir;
 
+        for (int ch = 0; ch < s->nb_channels; ch++)
+            s->loading[ch] = 1;
+    }
+
     return 0;
 }
 



More information about the ffmpeg-cvslog mailing list