diff mbox series

[FFmpeg-devel] avfilter/src_movie: switch to activate

Message ID 20200831172014.5269-1-onemda@gmail.com
State Superseded
Headers show
Series [FFmpeg-devel] avfilter/src_movie: switch to activate | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Paul B Mahol Aug. 31, 2020, 5:20 p.m. UTC
Allow to set the EOF timestamp.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
 libavfilter/src_movie.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

Comments

Michael Niedermayer Aug. 31, 2020, 9:16 p.m. UTC | #1
On Mon, Aug 31, 2020 at 07:20:14PM +0200, Paul B Mahol wrote:
> Allow to set the EOF timestamp.
> 
> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> ---
>  libavfilter/src_movie.c | 32 ++++++++++++++++++++++----------
>  1 file changed, 22 insertions(+), 10 deletions(-)

The following seems to end in an infinite loop after this patch

./ffmpeg -f lavfi -i 'amovie=fate-suite//wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv,asplit=3[out1][a][b]; [a]showwaves=s=340x240,pad=iw:ih*2[waves]; [b]showspectrum=s=340x240[spectrum]; [waves][spectrum] overlay=0:h [out0]' -t 0.1 -qscale 2  -y w.avi


[...]
diff mbox series

Patch

diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
index eeb8609855..2920ec06c1 100644
--- a/libavfilter/src_movie.c
+++ b/libavfilter/src_movie.c
@@ -44,6 +44,7 @@ 
 
 #include "audio.h"
 #include "avfilter.h"
+#include "filters.h"
 #include "formats.h"
 #include "internal.h"
 #include "video.h"
@@ -97,7 +98,6 @@  static const AVOption movie_options[]= {
 };
 
 static int movie_config_output_props(AVFilterLink *outlink);
-static int movie_request_frame(AVFilterLink *outlink);
 
 static AVStream *find_stream(void *log, AVFormatContext *avf, const char *spec)
 {
@@ -309,7 +309,6 @@  static av_cold int movie_common_init(AVFilterContext *ctx)
         if (!pad.name)
             return AVERROR(ENOMEM);
         pad.config_props  = movie_config_output_props;
-        pad.request_frame = movie_request_frame;
         if ((ret = ff_insert_outpad(ctx, i, &pad)) < 0) {
             av_freep(&pad.name);
             return ret;
@@ -595,17 +594,28 @@  static int movie_push_frame(AVFilterContext *ctx, unsigned out_id)
     return pkt_out_id == out_id;
 }
 
-static int movie_request_frame(AVFilterLink *outlink)
+static int activate(AVFilterContext *ctx)
 {
-    AVFilterContext *ctx = outlink->src;
-    unsigned out_id = FF_OUTLINK_IDX(outlink);
-    int ret;
+    MovieContext *movie = ctx->priv;
+    int i;
+
+    for (i = 0; i < ctx->nb_outputs; i++) {
+        AVFilterLink *outlink = ctx->outputs[i];
+
+        if (ff_outlink_frame_wanted(outlink)) {
+            int ret = movie_push_frame(ctx, i);
 
-    while (1) {
-        ret = movie_push_frame(ctx, out_id);
-        if (ret)
-            return FFMIN(ret, 0);
+            if (ret) {
+                if (ret < 0)
+                    ff_outlink_set_status(outlink, AVERROR_EOF, movie->st[i].last_pts);
+                return 0;
+            }
+        }
     }
+
+    ff_filter_set_ready(ctx, 100);
+
+    return 0;
 }
 
 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
@@ -666,6 +676,7 @@  AVFilter ff_avsrc_movie = {
 
     .inputs    = NULL,
     .outputs   = NULL,
+    .activate  = activate,
     .flags     = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
     .process_command = process_command
 };
@@ -687,6 +698,7 @@  AVFilter ff_avsrc_amovie = {
 
     .inputs     = NULL,
     .outputs    = NULL,
+    .activate   = activate,
     .priv_class = &amovie_class,
     .flags      = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
     .process_command = process_command,