diff options
author | Paul B Mahol <onemda@gmail.com> | 2019-11-17 11:57:52 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2019-11-17 11:57:52 +0100 |
commit | 90622f9e8faf4564cb53db8aa841aa168733732e (patch) | |
tree | 6c18fbc16aee9370bf1a73cf36686a869918fc39 /libavfilter/af_aecho.c | |
parent | b741a84a15aed8afa01800dbc4b8b0e344e5d2da (diff) | |
download | ffmpeg-90622f9e8faf4564cb53db8aa841aa168733732e.tar.gz |
avfilter/af_aecho: switch to activate
Diffstat (limited to 'libavfilter/af_aecho.c')
-rw-r--r-- | libavfilter/af_aecho.c | 69 |
1 files changed, 47 insertions, 22 deletions
diff --git a/libavfilter/af_aecho.c b/libavfilter/af_aecho.c index 876a149df4..7a7b8bccf2 100644 --- a/libavfilter/af_aecho.c +++ b/libavfilter/af_aecho.c @@ -24,6 +24,7 @@ #include "libavutil/samplefmt.h" #include "avfilter.h" #include "audio.h" +#include "filters.h" #include "internal.h" typedef struct AudioEchoContext { @@ -36,6 +37,7 @@ typedef struct AudioEchoContext { uint8_t **delayptrs; int max_samples, fade_out; int *samples; + int eof; int64_t next_pts; void (*echo_samples)(struct AudioEchoContext *ctx, uint8_t **delayptrs, @@ -302,42 +304,65 @@ static int request_frame(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; AudioEchoContext *s = ctx->priv; - int ret; + int nb_samples = FFMIN(s->fade_out, 2048); + AVFrame *frame = ff_get_audio_buffer(outlink, nb_samples); - ret = ff_request_frame(ctx->inputs[0]); + if (!frame) + return AVERROR(ENOMEM); + s->fade_out -= nb_samples; - if (ret == AVERROR_EOF && !ctx->is_disabled && s->fade_out) { - int nb_samples = FFMIN(s->fade_out, 2048); - AVFrame *frame; + av_samples_set_silence(frame->extended_data, 0, + frame->nb_samples, + outlink->channels, + frame->format); - frame = ff_get_audio_buffer(outlink, nb_samples); - if (!frame) - return AVERROR(ENOMEM); - s->fade_out -= nb_samples; + s->echo_samples(s, s->delayptrs, frame->extended_data, frame->extended_data, + frame->nb_samples, outlink->channels); - av_samples_set_silence(frame->extended_data, 0, - frame->nb_samples, - outlink->channels, - frame->format); + frame->pts = s->next_pts; + if (s->next_pts != AV_NOPTS_VALUE) + s->next_pts += av_rescale_q(nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base); - s->echo_samples(s, s->delayptrs, frame->extended_data, frame->extended_data, - frame->nb_samples, outlink->channels); + return ff_filter_frame(outlink, frame); +} + +static int activate(AVFilterContext *ctx) +{ + AVFilterLink *inlink = ctx->inputs[0]; + AVFilterLink *outlink = ctx->outputs[0]; + AudioEchoContext *s = ctx->priv; + AVFrame *in; + int ret, status; + int64_t pts; - frame->pts = s->next_pts; - if (s->next_pts != AV_NOPTS_VALUE) - s->next_pts += av_rescale_q(nb_samples, (AVRational){1, outlink->sample_rate}, outlink->time_base); + FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink); - return ff_filter_frame(outlink, frame); + ret = ff_inlink_consume_frame(inlink, &in); + if (ret < 0) + return ret; + if (ret > 0) + return filter_frame(inlink, in); + + if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &pts)) { + if (status == AVERROR_EOF) + s->eof = 1; } - return ret; + if (s->eof && s->fade_out <= 0) { + ff_outlink_set_status(outlink, AVERROR_EOF, s->next_pts); + return 0; + } + + if (!s->eof) + FF_FILTER_FORWARD_WANTED(outlink, inlink); + + return request_frame(outlink); } static const AVFilterPad aecho_inputs[] = { { .name = "default", .type = AVMEDIA_TYPE_AUDIO, - .filter_frame = filter_frame, }, { NULL } }; @@ -345,7 +370,6 @@ static const AVFilterPad aecho_inputs[] = { static const AVFilterPad aecho_outputs[] = { { .name = "default", - .request_frame = request_frame, .config_props = config_output, .type = AVMEDIA_TYPE_AUDIO, }, @@ -359,6 +383,7 @@ AVFilter ff_af_aecho = { .priv_size = sizeof(AudioEchoContext), .priv_class = &aecho_class, .init = init, + .activate = activate, .uninit = uninit, .inputs = aecho_inputs, .outputs = aecho_outputs, |