diff mbox series

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

Message ID 20200831215820.1930-1-onemda@gmail.com
State Accepted
Headers show
Series [FFmpeg-devel] avfilter/src_movie: switch to activate
Related show

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, 9:58 p.m. UTC
Allow to set the EOF timestamp.

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

Patch

diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
index eeb8609855..b951b7e134 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,30 @@  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 nb_eofs = 0;
+
+    for (int i = 0; i < ctx->nb_outputs; i++) {
+        AVFilterLink *outlink = ctx->outputs[i];
 
-    while (1) {
-        ret = movie_push_frame(ctx, out_id);
-        if (ret)
-            return FFMIN(ret, 0);
+        nb_eofs += !!ff_outlink_get_status(outlink);
+        if (ff_outlink_frame_wanted(outlink)) {
+            int ret = movie_push_frame(ctx, i);
+
+            if (ret) {
+                if (ret < 0)
+                    ff_outlink_set_status(outlink, AVERROR_EOF, movie->st[i].last_pts);
+                return 0;
+            }
+        }
     }
+
+    if (nb_eofs != ctx->nb_outputs)
+        ff_filter_set_ready(ctx, 100);
+
+    return 0;
 }
 
 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
@@ -666,6 +678,7 @@  AVFilter ff_avsrc_movie = {
 
     .inputs    = NULL,
     .outputs   = NULL,
+    .activate  = activate,
     .flags     = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
     .process_command = process_command
 };
@@ -687,6 +700,7 @@  AVFilter ff_avsrc_amovie = {
 
     .inputs     = NULL,
     .outputs    = NULL,
+    .activate   = activate,
     .priv_class = &amovie_class,
     .flags      = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
     .process_command = process_command,