[FFmpeg-cvslog] lavfi/af_join: partially fix scheduling.
Nicolas George
git at videolan.org
Sat Nov 7 18:57:28 CET 2015
ffmpeg | branch: master | Nicolas George <george at nsup.org> | Thu Oct 22 09:56:11 2015 +0200| [d0b82d798d08a13d33226128bdd6d0cfe6f10c3a] | committer: Nicolas George
lavfi/af_join: partially fix scheduling.
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=d0b82d798d08a13d33226128bdd6d0cfe6f10c3a
---
libavfilter/af_join.c | 50 ++++++++++++++++++++++++++++++++-----------------
1 file changed, 33 insertions(+), 17 deletions(-)
diff --git a/libavfilter/af_join.c b/libavfilter/af_join.c
index f5a1c50..bd780cc 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 */
More information about the ffmpeg-cvslog
mailing list