summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2020-08-31 19:10:43 +0200
committerPaul B Mahol <onemda@gmail.com>2020-09-04 19:37:29 +0200
commitabc884bcc005c450a34e56cd1f4b8b6fa17ea768 (patch)
tree78603ab925bd3b0cae21a2e6b5c94cdeb8d569f3 /libavfilter
parent939f4b35b838b2295d494ff76bfb1c870f98945d (diff)
avfilter/src_movie: switch to activate
Allow to set the EOF timestamp.
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/src_movie.c37
1 files changed, 27 insertions, 10 deletions
diff --git a/libavfilter/src_movie.c b/libavfilter/src_movie.c
index eeb8609855..fc26be15b6 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,33 @@ 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];
+
+ nb_eofs += !!ff_outlink_get_status(outlink);
+ 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 == AVERROR_EOF) {
+ ff_outlink_set_status(outlink, AVERROR_EOF, movie->st[i].last_pts);
+ return 0;
+ } else if (ret) {
+ return FFMIN(ret, 0);
+ }
+ }
+ }
+
+ if (nb_eofs != ctx->nb_outputs) {
+ ff_filter_set_ready(ctx, 100);
+ return 0;
}
+
+ return FFERROR_NOT_READY;
}
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
@@ -666,6 +681,7 @@ AVFilter ff_avsrc_movie = {
.inputs = NULL,
.outputs = NULL,
+ .activate = activate,
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
.process_command = process_command
};
@@ -687,6 +703,7 @@ AVFilter ff_avsrc_amovie = {
.inputs = NULL,
.outputs = NULL,
+ .activate = activate,
.priv_class = &amovie_class,
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
.process_command = process_command,