summaryrefslogtreecommitdiff
path: root/libavfilter/vaf_spectrumsynth.c
diff options
context:
space:
mode:
authorNicolas George <george@nsup.org>2020-08-12 19:01:34 +0200
committerNicolas George <george@nsup.org>2020-08-20 18:55:19 +0200
commit29e0c30b1c182199db5802ad785a928c0663c352 (patch)
tree15cc602429b1d4d31a39e9b63743fe1c00769d07 /libavfilter/vaf_spectrumsynth.c
parent7c1fbf7cf3c32b02c53025d2e08fe460b9b275b2 (diff)
lavfi/vaf_spectrumsynth: switch to activate.
Preserve the original workings, that does not use frames timestamps and therefore is very fragile. Allow to remove needs_fifo.
Diffstat (limited to 'libavfilter/vaf_spectrumsynth.c')
-rw-r--r--libavfilter/vaf_spectrumsynth.c69
1 files changed, 34 insertions, 35 deletions
diff --git a/libavfilter/vaf_spectrumsynth.c b/libavfilter/vaf_spectrumsynth.c
index fed2cbba03..6a0c45450d 100644
--- a/libavfilter/vaf_spectrumsynth.c
+++ b/libavfilter/vaf_spectrumsynth.c
@@ -34,6 +34,7 @@
#include "formats.h"
#include "audio.h"
#include "video.h"
+#include "filters.h"
#include "internal.h"
#include "window_func.h"
@@ -222,25 +223,6 @@ static int config_output(AVFilterLink *outlink)
return 0;
}
-static int request_frame(AVFilterLink *outlink)
-{
- AVFilterContext *ctx = outlink->src;
- SpectrumSynthContext *s = ctx->priv;
- int ret;
-
- if (!s->magnitude) {
- ret = ff_request_frame(ctx->inputs[0]);
- if (ret < 0)
- return ret;
- }
- if (!s->phase) {
- ret = ff_request_frame(ctx->inputs[1]);
- if (ret < 0)
- return ret;
- }
- return 0;
-}
-
static void read16_fft_bin(SpectrumSynthContext *s,
int x, int y, int f, int ch)
{
@@ -470,22 +452,43 @@ static int try_push_frames(AVFilterContext *ctx)
return ret;
}
-static int filter_frame_magnitude(AVFilterLink *inlink, AVFrame *magnitude)
+static int activate(AVFilterContext *ctx)
{
- AVFilterContext *ctx = inlink->dst;
SpectrumSynthContext *s = ctx->priv;
+ AVFrame **staging[2] = { &s->magnitude, &s->phase };
+ int64_t pts;
+ int i, ret;
- s->magnitude = magnitude;
- return try_push_frames(ctx);
-}
+ FF_FILTER_FORWARD_STATUS_BACK_ALL(ctx->outputs[0], ctx);
-static int filter_frame_phase(AVFilterLink *inlink, AVFrame *phase)
-{
- AVFilterContext *ctx = inlink->dst;
- SpectrumSynthContext *s = ctx->priv;
+ for (i = 0; i < 2; i++) {
+ if (*staging[i])
+ continue;
+ ret = ff_inlink_consume_frame(ctx->inputs[i], staging[i]);
+ if (ret < 0)
+ return ret;
+ if (ret) {
+ ff_filter_set_ready(ctx, 10);
+ return try_push_frames(ctx);
+ }
+ }
+
+ for (i = 0; i < 2; i++) {
+ if (ff_inlink_acknowledge_status(ctx->inputs[i], &ret, &pts)) {
+ ff_outlink_set_status(ctx->outputs[0], ret, pts);
+ ff_inlink_set_status(ctx->inputs[1 - i], ret);
+ return 0;
+ }
+ }
+
+ if (ff_outlink_frame_wanted(ctx->outputs[0])) {
+ for (i = 0; i < 2; i++) {
+ if (!*staging[i])
+ ff_inlink_request_frame(ctx->inputs[i]);
+ }
+ }
- s->phase = phase;
- return try_push_frames(ctx);
+ return FFERROR_NOT_READY;
}
static av_cold void uninit(AVFilterContext *ctx)
@@ -509,14 +512,10 @@ static const AVFilterPad spectrumsynth_inputs[] = {
{
.name = "magnitude",
.type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame_magnitude,
- .needs_fifo = 1,
},
{
.name = "phase",
.type = AVMEDIA_TYPE_VIDEO,
- .filter_frame = filter_frame_phase,
- .needs_fifo = 1,
},
{ NULL }
};
@@ -526,7 +525,6 @@ static const AVFilterPad spectrumsynth_outputs[] = {
.name = "default",
.type = AVMEDIA_TYPE_AUDIO,
.config_props = config_output,
- .request_frame = request_frame,
},
{ NULL }
};
@@ -536,6 +534,7 @@ AVFilter ff_vaf_spectrumsynth = {
.description = NULL_IF_CONFIG_SMALL("Convert input spectrum videos to audio output."),
.uninit = uninit,
.query_formats = query_formats,
+ .activate = activate,
.priv_size = sizeof(SpectrumSynthContext),
.inputs = spectrumsynth_inputs,
.outputs = spectrumsynth_outputs,