mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-18 12:56:56 +00:00
Revert "avfilter/src_movie: switch to activate"
This reverts commit abc884bcc0
.
This patch was pushed without actual review.
An actual review would have revealed that the switch to activate
was not done correctly because the logic between request_frame()
and frame_wanted is not as direct with filters with multiple
outputs than with a single output.
This commit is contained in:
parent
ddba05afe4
commit
d1f3d721df
@ -44,7 +44,6 @@
|
||||
|
||||
#include "audio.h"
|
||||
#include "avfilter.h"
|
||||
#include "filters.h"
|
||||
#include "formats.h"
|
||||
#include "internal.h"
|
||||
#include "video.h"
|
||||
@ -98,6 +97,7 @@ 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,6 +309,7 @@ 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;
|
||||
@ -594,33 +595,17 @@ static int movie_push_frame(AVFilterContext *ctx, unsigned out_id)
|
||||
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;
|
||||
AVFilterContext *ctx = outlink->src;
|
||||
unsigned out_id = FF_OUTLINK_IDX(outlink);
|
||||
int ret;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
while (1) {
|
||||
ret = movie_push_frame(ctx, out_id);
|
||||
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,
|
||||
@ -681,7 +666,6 @@ AVFilter ff_avsrc_movie = {
|
||||
|
||||
.inputs = NULL,
|
||||
.outputs = NULL,
|
||||
.activate = activate,
|
||||
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
|
||||
.process_command = process_command
|
||||
};
|
||||
@ -703,7 +687,6 @@ AVFilter ff_avsrc_amovie = {
|
||||
|
||||
.inputs = NULL,
|
||||
.outputs = NULL,
|
||||
.activate = activate,
|
||||
.priv_class = &amovie_class,
|
||||
.flags = AVFILTER_FLAG_DYNAMIC_OUTPUTS,
|
||||
.process_command = process_command,
|
||||
|
Loading…
Reference in New Issue
Block a user