diff --git a/doc/APIchanges b/doc/APIchanges
index b98a3419c476154c0031db2c1fed1e105f50ad51..cc67cbf6f876798856824e566f0f0451fed1c65f 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 e8f59c2de71a3de4eb47e54ea8c2d73731abfdf1..ad5aedd5f7de937c6b4db64683ef612db690ef6f 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 e42c78196bd85dd4fe638323e52c074acac4b8c7..0652113f2bc1326ed93362093d604ea3920ca5b9 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 4b16de1f8ae6370580da6dab7dd3e39969acf4c3..6d14cff1fbb67992066f39e7c8b2e8af15057312 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, \