Browse code

avfilter/af_sidechaincompress: switch to activate

Paul B Mahol authored on 2017/08/25 03:34:35
Showing 1 changed files
... ...
@@ -32,6 +32,7 @@
32 32
 
33 33
 #include "audio.h"
34 34
 #include "avfilter.h"
35
+#include "filters.h"
35 36
 #include "formats.h"
36 37
 #include "hermite.h"
37 38
 #include "internal.h"
... ...
@@ -183,71 +184,76 @@ static void compressor(SidechainCompressContext *s,
183 183
 }
184 184
 
185 185
 #if CONFIG_SIDECHAINCOMPRESS_FILTER
186
-static int filter_frame(AVFilterLink *link, AVFrame *frame)
186
+static int activate(AVFilterContext *ctx)
187 187
 {
188
-    AVFilterContext *ctx = link->dst;
189 188
     SidechainCompressContext *s = ctx->priv;
190
-    AVFilterLink *outlink = ctx->outputs[0];
191 189
     AVFrame *out = NULL, *in[2] = { NULL };
190
+    int ret, i, status, nb_samples;
192 191
     double *dst;
193
-    int nb_samples;
194
-    int i;
192
+    int64_t pts;
195 193
 
196
-    for (i = 0; i < 2; i++)
197
-        if (link == ctx->inputs[i])
198
-            break;
199
-    av_assert0(i < 2);
200
-    av_audio_fifo_write(s->fifo[i], (void **)frame->extended_data,
201
-                        frame->nb_samples);
202
-    av_frame_free(&frame);
194
+    if ((ret = ff_inlink_consume_frame(ctx->inputs[0], &in[0])) > 0) {
195
+        av_audio_fifo_write(s->fifo[0], (void **)in[0]->extended_data,
196
+                            in[0]->nb_samples);
197
+        av_frame_free(&in[0]);
198
+    }
199
+    if (ret < 0)
200
+        return ret;
201
+    if ((ret = ff_inlink_consume_frame(ctx->inputs[1], &in[1])) > 0) {
202
+        av_audio_fifo_write(s->fifo[1], (void **)in[1]->extended_data,
203
+                            in[1]->nb_samples);
204
+        av_frame_free(&in[1]);
205
+    }
206
+    if (ret < 0)
207
+        return ret;
203 208
 
204 209
     nb_samples = FFMIN(av_audio_fifo_size(s->fifo[0]), av_audio_fifo_size(s->fifo[1]));
205
-    if (!nb_samples)
206
-        return 0;
207
-
208
-    out = ff_get_audio_buffer(outlink, nb_samples);
209
-    if (!out)
210
-        return AVERROR(ENOMEM);
211
-    for (i = 0; i < 2; i++) {
212
-        in[i] = ff_get_audio_buffer(ctx->inputs[i], nb_samples);
213
-        if (!in[i]) {
214
-            av_frame_free(&in[0]);
215
-            av_frame_free(&in[1]);
216
-            av_frame_free(&out);
210
+    if (nb_samples) {
211
+        out = ff_get_audio_buffer(ctx->outputs[0], nb_samples);
212
+        if (!out)
217 213
             return AVERROR(ENOMEM);
214
+        for (i = 0; i < 2; i++) {
215
+            in[i] = ff_get_audio_buffer(ctx->inputs[i], nb_samples);
216
+            if (!in[i]) {
217
+                av_frame_free(&in[0]);
218
+                av_frame_free(&in[1]);
219
+                av_frame_free(&out);
220
+                return AVERROR(ENOMEM);
221
+            }
222
+            av_audio_fifo_read(s->fifo[i], (void **)in[i]->data, nb_samples);
218 223
         }
219
-        av_audio_fifo_read(s->fifo[i], (void **)in[i]->data, nb_samples);
220
-    }
221 224
 
222
-    dst = (double *)out->data[0];
223
-    out->pts = s->pts;
224
-    s->pts += nb_samples;
225
+        dst = (double *)out->data[0];
226
+        out->pts = s->pts;
227
+        s->pts += nb_samples;
225 228
 
226
-    compressor(s, (double *)in[0]->data[0], dst,
227
-               (double *)in[1]->data[0], nb_samples,
228
-               s->level_in, s->level_sc,
229
-               ctx->inputs[0], ctx->inputs[1]);
229
+        compressor(s, (double *)in[0]->data[0], dst,
230
+                   (double *)in[1]->data[0], nb_samples,
231
+                   s->level_in, s->level_sc,
232
+                   ctx->inputs[0], ctx->inputs[1]);
230 233
 
231
-    av_frame_free(&in[0]);
232
-    av_frame_free(&in[1]);
234
+        av_frame_free(&in[0]);
235
+        av_frame_free(&in[1]);
233 236
 
234
-    return ff_filter_frame(outlink, out);
235
-}
236
-
237
-static int request_frame(AVFilterLink *outlink)
238
-{
239
-    AVFilterContext *ctx = outlink->src;
240
-    SidechainCompressContext *s = ctx->priv;
241
-    int i;
242
-
243
-    /* get a frame on each input */
244
-    for (i = 0; i < 2; i++) {
245
-        AVFilterLink *inlink = ctx->inputs[i];
246
-        if (!av_audio_fifo_size(s->fifo[i]))
247
-            return ff_request_frame(inlink);
237
+        ret = ff_filter_frame(ctx->outputs[0], out);
238
+        if (ret < 0)
239
+            return ret;
240
+    }
241
+    if (ff_inlink_acknowledge_status(ctx->inputs[0], &status, &pts)) {
242
+        ff_outlink_set_status(ctx->outputs[0], status, pts);
243
+        return 0;
244
+    } else if (ff_inlink_acknowledge_status(ctx->inputs[1], &status, &pts)) {
245
+        ff_outlink_set_status(ctx->outputs[0], status, pts);
246
+        return 0;
247
+    } else {
248
+        if (ff_outlink_frame_wanted(ctx->outputs[0])) {
249
+            if (!av_audio_fifo_size(s->fifo[0]))
250
+                ff_inlink_request_frame(ctx->inputs[0]);
251
+            if (!av_audio_fifo_size(s->fifo[1]))
252
+                ff_inlink_request_frame(ctx->inputs[1]);
253
+        }
254
+        return 0;
248 255
     }
249
-
250
-    return 0;
251 256
 }
252 257
 
253 258
 static int query_formats(AVFilterContext *ctx)
... ...
@@ -325,11 +331,9 @@ static const AVFilterPad sidechaincompress_inputs[] = {
325 325
     {
326 326
         .name           = "main",
327 327
         .type           = AVMEDIA_TYPE_AUDIO,
328
-        .filter_frame   = filter_frame,
329 328
     },{
330 329
         .name           = "sidechain",
331 330
         .type           = AVMEDIA_TYPE_AUDIO,
332
-        .filter_frame   = filter_frame,
333 331
     },
334 332
     { NULL }
335 333
 };
... ...
@@ -339,7 +343,6 @@ static const AVFilterPad sidechaincompress_outputs[] = {
339 339
         .name          = "default",
340 340
         .type          = AVMEDIA_TYPE_AUDIO,
341 341
         .config_props  = config_output,
342
-        .request_frame = request_frame,
343 342
     },
344 343
     { NULL }
345 344
 };
... ...
@@ -350,6 +353,7 @@ AVFilter ff_af_sidechaincompress = {
350 350
     .priv_size      = sizeof(SidechainCompressContext),
351 351
     .priv_class     = &sidechaincompress_class,
352 352
     .query_formats  = query_formats,
353
+    .activate       = activate,
353 354
     .uninit         = uninit,
354 355
     .inputs         = sidechaincompress_inputs,
355 356
     .outputs        = sidechaincompress_outputs,