diff options
author | Nicolas George <george@nsup.org> | 2015-10-22 09:56:11 +0200 |
---|---|---|
committer | Nicolas George <george@nsup.org> | 2015-11-07 16:43:36 +0100 |
commit | d0b82d798d08a13d33226128bdd6d0cfe6f10c3a (patch) | |
tree | 492f9aeb6c6a571dfce07dad57fd47323aa8070b | |
parent | 67d3f5296ea6dce884ac53f2ea37f45dabaa8bb3 (diff) | |
download | ffmpeg-d0b82d798d08a13d33226128bdd6d0cfe6f10c3a.tar.gz |
lavfi/af_join: partially fix scheduling.
-rw-r--r-- | libavfilter/af_join.c | 50 |
1 files changed, 33 insertions, 17 deletions
diff --git a/libavfilter/af_join.c b/libavfilter/af_join.c index f5a1c5060d..bd780cc379 100644 --- a/libavfilter/af_join.c +++ b/libavfilter/af_join.c @@ -78,11 +78,13 @@ static const AVOption join_options[] = { AVFILTER_DEFINE_CLASS(join); +static int try_push_frame(AVFilterContext *ctx); + static int filter_frame(AVFilterLink *link, AVFrame *frame) { AVFilterContext *ctx = link->dst; JoinContext *s = ctx->priv; - int i; + int i, j; for (i = 0; i < ctx->nb_inputs; i++) if (link == ctx->inputs[i]) @@ -91,7 +93,17 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) av_assert0(!s->input_frames[i]); s->input_frames[i] = frame; - return 0; + /* request the same number of samples on all inputs */ + /* FIXME that means a frame arriving asynchronously on a different input + will not have the requested number of samples */ + if (i == 0) { + int nb_samples = s->input_frames[0]->nb_samples; + + for (j = 1; !i && j < ctx->nb_inputs; j++) + ctx->inputs[j]->request_samples = nb_samples; + } + + return try_push_frame(ctx); } static int parse_maps(AVFilterContext *ctx) @@ -387,27 +399,31 @@ static int join_request_frame(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; JoinContext *s = ctx->priv; - AVFrame *frame; - int linesize = INT_MAX; - int nb_samples = 0; - int nb_buffers = 0; - int i, j, ret; + int i; /* get a frame on each input */ for (i = 0; i < ctx->nb_inputs; i++) { AVFilterLink *inlink = ctx->inputs[i]; + if (!s->input_frames[i]) + return ff_request_frame(inlink); + } + return 0; +} - if (!s->input_frames[i] && - (ret = ff_request_frame(inlink)) < 0) - return ret; - - /* request the same number of samples on all inputs */ - if (i == 0) { - nb_samples = s->input_frames[0]->nb_samples; +static int try_push_frame(AVFilterContext *ctx) +{ + AVFilterLink *outlink = ctx->outputs[0]; + JoinContext *s = ctx->priv; + AVFrame *frame; + int linesize = INT_MAX; + int nb_samples = INT_MAX; + int nb_buffers = 0; + int i, j, ret; - for (j = 1; !i && j < ctx->nb_inputs; j++) - ctx->inputs[j]->request_samples = nb_samples; - } + for (i = 0; i < ctx->nb_inputs; i++) { + if (!s->input_frames[i]) + return 0; + nb_samples = FFMIN(nb_samples, s->input_frames[i]->nb_samples); } /* setup the output frame */ |