#include "audio.h"
#include "avfilter.h"
-#include "filters.h"
#include "formats.h"
#include "internal.h"
#include "video.h"
};
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)
{
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;
return pkt_out_id == out_id;
}
-static int activate(AVFilterContext *ctx)
+static int movie_request_frame(AVFilterLink *outlink)
{
- 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);
-
- 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);
- }
- }
- }
+ AVFilterContext *ctx = outlink->src;
+ unsigned out_id = FF_OUTLINK_IDX(outlink);
+ int ret;
- if (nb_eofs != ctx->nb_outputs) {
- ff_filter_set_ready(ctx, 100);
- return 0;
+ while (1) {
+ ret = movie_push_frame(ctx, out_id);
+ if (ret)
+ return FFMIN(ret, 0);
}
-
- return FFERROR_NOT_READY;
}
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
.inputs = NULL,
.outputs = NULL,
- .activate = activate,
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
.process_command = process_command
};
.inputs = NULL,
.outputs = NULL,
- .activate = activate,
.priv_class = &amovie_class,
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
.process_command = process_command,