From 5ba2aef6ec47689300debd3ddd1f39cad010a971 Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Mon, 3 Apr 2017 15:01:45 +0200 Subject: [PATCH] lavfi/buffersrc: add av_buffersrc_close(). --- doc/APIchanges | 3 +++ libavfilter/buffersrc.c | 22 ++++++++++++---------- libavfilter/buffersrc.h | 8 ++++++++ libavfilter/version.h | 2 +- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index b98a3419c4..cc67cbf6f8 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2015-08-28 API changes, most recent first: +2017-09-08 - xxxxxxx - lavfi 6.103.100 - buffersrc.h + Add av_buffersrc_close(). + 2017-09-04 - xxxxxxx - lavc 57.105.100 - avcodec.h Add AV_HWACCEL_CODEC_CAP_EXPERIMENTAL, replacing the deprecated HWACCEL_CODEC_CAP_EXPERIMENTAL flag. diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c index e8f59c2de7..ad5aedd5f7 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); /** * @} diff --git a/libavfilter/version.h b/libavfilter/version.h index 4b16de1f8a..6d14cff1fb 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFILTER_VERSION_MAJOR 6 -#define LIBAVFILTER_VERSION_MINOR 102 +#define LIBAVFILTER_VERSION_MINOR 103 #define LIBAVFILTER_VERSION_MICRO 100 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \