Re: [FFmpeg-devel] [PATCH] avfilter/af_amerge: port to activate API
Paul B Mahol (2018-05-04): > Signed-off-by: Paul B Mahol > --- > libavfilter/af_amerge.c | 144 > ++-- > 1 file changed, 67 insertions(+), 77 deletions(-) > > diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c > index 09c660ef49..8b71b3ce49 100644 > --- a/libavfilter/af_amerge.c > +++ b/libavfilter/af_amerge.c > @@ -31,8 +31,8 @@ > #include "libavutil/channel_layout.h" > #include "libavutil/opt.h" > #include "avfilter.h" > +#include "filters.h" > #include "audio.h" > -#include "bufferqueue.h" > #include "internal.h" > > #define SWR_CH_MAX 64 > @@ -43,10 +43,7 @@ typedef struct AMergeContext { > int route[SWR_CH_MAX]; /**< channels routing, see copy_samples */ > int bps; > struct amerge_input { > -struct FFBufQueue queue; > int nb_ch; /**< number of channels for the input */ > -int nb_samples; > -int pos; > } *in; > } AMergeContext; > > @@ -67,8 +64,6 @@ static av_cold void uninit(AVFilterContext *ctx) > int i; > > for (i = 0; i < s->nb_inputs; i++) { > -if (s->in) > -ff_bufqueue_discard_all(&s->in[i].queue); > if (ctx->input_pads) > av_freep(&ctx->input_pads[i].name); > } > @@ -183,21 +178,6 @@ static int config_output(AVFilterLink *outlink) > return 0; > } > > -static int request_frame(AVFilterLink *outlink) > -{ > -AVFilterContext *ctx = outlink->src; > -AMergeContext *s = ctx->priv; > -int i, ret; > - > -for (i = 0; i < s->nb_inputs; i++) > -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; > -} > - > /** > * Copy samples from several input streams to one output stream. > * @param nb_inputs number of inputs > @@ -235,90 +215,101 @@ static inline void copy_samples(int nb_inputs, struct > amerge_input in[], > } > } > > -static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) > +static void free_frames(int nb_inputs, AVFrame **input_frames) > +{ > +int i; > +for (i = 0; i < nb_inputs; i++) > +av_frame_free(&input_frames[i]); > +} > + > +static int try_push_frame(AVFilterContext *ctx, int nb_samples) > { > -AVFilterContext *ctx = inlink->dst; > AMergeContext *s = ctx->priv; > -AVFilterLink *const outlink = ctx->outputs[0]; > -int input_number; > -int nb_samples, ns, i; > -AVFrame *outbuf, *inbuf[SWR_CH_MAX]; > -uint8_t *ins[SWR_CH_MAX], *outs; > - > -for (input_number = 0; input_number < s->nb_inputs; input_number++) > -if (inlink == ctx->inputs[input_number]) > -break; > -av_assert1(input_number < s->nb_inputs); > -if (ff_bufqueue_is_full(&s->in[input_number].queue)) { > -av_frame_free(&insamples); > -return AVERROR(ENOMEM); > +AVFilterLink *outlink = ctx->outputs[0]; > +int i, ret; > +AVFrame *outbuf, *inbuf[SWR_CH_MAX] = { NULL }; > +uint8_t *outs, *ins[SWR_CH_MAX]; > + > +for (i = 0; i < ctx->nb_inputs; i++) { > +ret = ff_inlink_consume_samples(ctx->inputs[i], nb_samples, > nb_samples, &inbuf[i]); > +if (ret < 0) { > +free_frames(i, inbuf); > +return ret; > +} > +ins[i] = inbuf[i]->data[0]; > } > -ff_bufqueue_add(ctx, &s->in[input_number].queue, > av_frame_clone(insamples)); > -s->in[input_number].nb_samples += insamples->nb_samples; > -av_frame_free(&insamples); > -nb_samples = s->in[0].nb_samples; > -for (i = 1; i < s->nb_inputs; i++) > -nb_samples = FFMIN(nb_samples, s->in[i].nb_samples); > -if (!nb_samples) > -return 0; > > outbuf = ff_get_audio_buffer(ctx->outputs[0], nb_samples); > -if (!outbuf) > +if (!outbuf) { > +free_frames(s->nb_inputs, inbuf); > return AVERROR(ENOMEM); > -outs = outbuf->data[0]; > -for (i = 0; i < s->nb_inputs; i++) { > -inbuf[i] = ff_bufqueue_peek(&s->in[i].queue, 0); > -ins[i] = inbuf[i]->data[0] + > - s->in[i].pos * s->in[i].nb_ch * s->bps; > } > -av_frame_copy_props(outbuf, inbuf[0]); > -outbuf->pts = inbuf[0]->pts == AV_NOPTS_VALUE ? AV_NOPTS_VALUE : > - inbuf[0]->pts + > - av_rescale_q(s->in[0].pos, > - av_make_q(1, ctx->inputs[0]->sample_rate), > - ctx->outputs[0]->time_base); > + > +outs = outbuf->data[0]; > +outbuf->pts = inbuf[0]->pts; > > outbuf->nb_samples = nb_samples; > outbuf->channel_layout = outlink->channel_layout; > outbuf->channels = outlink->channels; > > while (nb_samples) { > -ns = nb_samples; > -for (i = 0; i < s->nb_inputs; i++) > -ns = FFMIN(ns
Re: [FFmpeg-devel] [PATCH] avfilter/af_amerge: port to activate API
On 5/4/18, Paul B Mahol wrote: > Signed-off-by: Paul B Mahol > --- > libavfilter/af_amerge.c | 144 > ++-- > 1 file changed, 67 insertions(+), 77 deletions(-) > Fixes #6318. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avfilter/af_amerge: port to activate API
Signed-off-by: Paul B Mahol --- libavfilter/af_amerge.c | 144 ++-- 1 file changed, 67 insertions(+), 77 deletions(-) diff --git a/libavfilter/af_amerge.c b/libavfilter/af_amerge.c index 09c660ef49..8b71b3ce49 100644 --- a/libavfilter/af_amerge.c +++ b/libavfilter/af_amerge.c @@ -31,8 +31,8 @@ #include "libavutil/channel_layout.h" #include "libavutil/opt.h" #include "avfilter.h" +#include "filters.h" #include "audio.h" -#include "bufferqueue.h" #include "internal.h" #define SWR_CH_MAX 64 @@ -43,10 +43,7 @@ typedef struct AMergeContext { int route[SWR_CH_MAX]; /**< channels routing, see copy_samples */ int bps; struct amerge_input { -struct FFBufQueue queue; int nb_ch; /**< number of channels for the input */ -int nb_samples; -int pos; } *in; } AMergeContext; @@ -67,8 +64,6 @@ static av_cold void uninit(AVFilterContext *ctx) int i; for (i = 0; i < s->nb_inputs; i++) { -if (s->in) -ff_bufqueue_discard_all(&s->in[i].queue); if (ctx->input_pads) av_freep(&ctx->input_pads[i].name); } @@ -183,21 +178,6 @@ static int config_output(AVFilterLink *outlink) return 0; } -static int request_frame(AVFilterLink *outlink) -{ -AVFilterContext *ctx = outlink->src; -AMergeContext *s = ctx->priv; -int i, ret; - -for (i = 0; i < s->nb_inputs; i++) -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; -} - /** * Copy samples from several input streams to one output stream. * @param nb_inputs number of inputs @@ -235,90 +215,101 @@ static inline void copy_samples(int nb_inputs, struct amerge_input in[], } } -static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) +static void free_frames(int nb_inputs, AVFrame **input_frames) +{ +int i; +for (i = 0; i < nb_inputs; i++) +av_frame_free(&input_frames[i]); +} + +static int try_push_frame(AVFilterContext *ctx, int nb_samples) { -AVFilterContext *ctx = inlink->dst; AMergeContext *s = ctx->priv; -AVFilterLink *const outlink = ctx->outputs[0]; -int input_number; -int nb_samples, ns, i; -AVFrame *outbuf, *inbuf[SWR_CH_MAX]; -uint8_t *ins[SWR_CH_MAX], *outs; - -for (input_number = 0; input_number < s->nb_inputs; input_number++) -if (inlink == ctx->inputs[input_number]) -break; -av_assert1(input_number < s->nb_inputs); -if (ff_bufqueue_is_full(&s->in[input_number].queue)) { -av_frame_free(&insamples); -return AVERROR(ENOMEM); +AVFilterLink *outlink = ctx->outputs[0]; +int i, ret; +AVFrame *outbuf, *inbuf[SWR_CH_MAX] = { NULL }; +uint8_t *outs, *ins[SWR_CH_MAX]; + +for (i = 0; i < ctx->nb_inputs; i++) { +ret = ff_inlink_consume_samples(ctx->inputs[i], nb_samples, nb_samples, &inbuf[i]); +if (ret < 0) { +free_frames(i, inbuf); +return ret; +} +ins[i] = inbuf[i]->data[0]; } -ff_bufqueue_add(ctx, &s->in[input_number].queue, av_frame_clone(insamples)); -s->in[input_number].nb_samples += insamples->nb_samples; -av_frame_free(&insamples); -nb_samples = s->in[0].nb_samples; -for (i = 1; i < s->nb_inputs; i++) -nb_samples = FFMIN(nb_samples, s->in[i].nb_samples); -if (!nb_samples) -return 0; outbuf = ff_get_audio_buffer(ctx->outputs[0], nb_samples); -if (!outbuf) +if (!outbuf) { +free_frames(s->nb_inputs, inbuf); return AVERROR(ENOMEM); -outs = outbuf->data[0]; -for (i = 0; i < s->nb_inputs; i++) { -inbuf[i] = ff_bufqueue_peek(&s->in[i].queue, 0); -ins[i] = inbuf[i]->data[0] + - s->in[i].pos * s->in[i].nb_ch * s->bps; } -av_frame_copy_props(outbuf, inbuf[0]); -outbuf->pts = inbuf[0]->pts == AV_NOPTS_VALUE ? AV_NOPTS_VALUE : - inbuf[0]->pts + - av_rescale_q(s->in[0].pos, - av_make_q(1, ctx->inputs[0]->sample_rate), - ctx->outputs[0]->time_base); + +outs = outbuf->data[0]; +outbuf->pts = inbuf[0]->pts; outbuf->nb_samples = nb_samples; outbuf->channel_layout = outlink->channel_layout; outbuf->channels = outlink->channels; while (nb_samples) { -ns = nb_samples; -for (i = 0; i < s->nb_inputs; i++) -ns = FFMIN(ns, inbuf[i]->nb_samples - s->in[i].pos); /* Unroll the most common sample formats: speed +~350% for the loop, +~13% overall (including two common decoders) */ switch (s->bps) { case 1: -copy_samples(s->nb_inputs, s->in, s->route, ins, &outs, ns, 1); +