[FFmpeg-devel] [PATCH 3/4] lavfi/buffersrc: add av_buffersrc_close().
wm4
nfxjfg at googlemail.com
Thu Apr 6 12:03:52 EEST 2017
On Thu, 6 Apr 2017 10:44:50 +0200
Nicolas George <george at nsup.org> wrote:
> TODO APIChanges and minor bump.
>
> Signed-off-by: Nicolas George <george at nsup.org>
> ---
> libavfilter/buffersrc.c | 22 ++++++++++++----------
> libavfilter/buffersrc.h | 8 ++++++++
> 2 files changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
> index 3f80d5f413..250b06dfbc 100644
> --- a/libavfilter/buffersrc.c
> +++ b/libavfilter/buffersrc.c
> @@ -196,16 +196,9 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
>
> s->nb_failed_requests = 0;
>
> - if (!frame) {
> - s->eof = 1;
> - ff_avfilter_link_set_in_status(ctx->outputs[0], AVERROR_EOF, AV_NOPTS_VALUE);
> - if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
> - ret = push_frame(ctx->graph);
> - if (ret < 0)
> - return ret;
> - }
> - return 0;
> - } else if (s->eof)
> + if (!frame)
> + return av_buffersrc_close(ctx, AV_NOPTS_VALUE, flags);
> + if (s->eof)
> return AVERROR(EINVAL);
>
> refcounted = !!frame->buf[0];
> @@ -267,6 +260,15 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
> return 0;
> }
>
> +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags)
> +{
> + BufferSourceContext *s = ctx->priv;
> +
> + s->eof = 1;
> + ff_avfilter_link_set_in_status(ctx->outputs[0], AVERROR_EOF, pts);
> + return (flags & AV_BUFFERSRC_FLAG_PUSH) ? push_frame(ctx->graph) : 0;
> +}
> +
> static av_cold int init_video(AVFilterContext *ctx)
> {
> BufferSourceContext *c = ctx->priv;
> diff --git a/libavfilter/buffersrc.h b/libavfilter/buffersrc.h
> index e42c78196b..0652113f2b 100644
> --- a/libavfilter/buffersrc.h
> +++ b/libavfilter/buffersrc.h
> @@ -193,6 +193,14 @@ av_warn_unused_result
> int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src,
> AVFrame *frame, int flags);
>
> +/**
> + * Close the buffer source after EOF.
> + *
> + * This is similar to passing NULL to av_buffersrc_add_frame_flags()
> + * except it takes the timestamp of the EOF, i.e. the timestamp of the end
> + * of the last frame.
> + */
> +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, unsigned flags);
>
> /**
> * @}
Not sure why this special function, instead of adding a frame duration
field to AVFrame. (Which would not necessarily be the often unreliable
or broken pkt_duration.)
More information about the ffmpeg-devel
mailing list