X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Faf_amerge.c;h=8ea01e206bd55766fce541fd96bfde43a0c472ba;hb=084f3addda7531a22d656b769120c6453e880226;hp=4a8c6d5bd0b1b4b659fa87d55e554881af6dc447;hpb=8a91452e83e763dc38d84912fe7978acede2c039;p=ffmpeg diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c index 4a8c6d5bd0b..8ea01e206bd 100644 --- a/libavfilter/af_amerge.c +++ b/libavfilter/af_amerge.c @@ -23,6 +23,9 @@ * Audio merging filter */ +#define FF_INTERNAL_FIELDS 1 +#include "framequeue.h" + #include "libavutil/avstring.h" #include "libavutil/bprint.h" #include "libavutil/channel_layout.h" @@ -93,10 +96,15 @@ static int query_formats(AVFilterContext *ctx) av_get_channel_layout_string(buf, sizeof(buf), 0, inlayout[i]); av_log(ctx, AV_LOG_INFO, "Using \"%s\" for input %d\n", buf, i + 1); } - s->in[i].nb_ch = av_get_channel_layout_nb_channels(inlayout[i]); - if (outlayout & inlayout[i]) + s->in[i].nb_ch = FF_LAYOUT2COUNT(inlayout[i]); + if (s->in[i].nb_ch) { overlap++; - outlayout |= inlayout[i]; + } else { + s->in[i].nb_ch = av_get_channel_layout_nb_channels(inlayout[i]); + if (outlayout & inlayout[i]) + overlap++; + outlayout |= inlayout[i]; + } nb_ch += s->in[i].nb_ch; } if (nb_ch > SWR_CH_MAX) { @@ -182,7 +190,9 @@ static int request_frame(AVFilterLink *outlink) int i, ret; for (i = 0; i < s->nb_inputs; i++) - if (!s->in[i].nb_samples) + if (!s->in[i].nb_samples || + /* detect EOF immediately */ + (ctx->inputs[i]->status_in && !ctx->inputs[i]->status_out)) if ((ret = ff_request_frame(ctx->inputs[i])) < 0) return ret; return 0;