[FFmpeg-cvslog] lavfi/overlay: add repeatlast option

Stefano Sabatini git at videolan.org
Fri Apr 12 00:20:36 CEST 2013


ffmpeg | branch: master | Stefano Sabatini <stefasab at gmail.com> | Fri Apr  5 13:49:20 2013 +0200| [ed2c827575a665ca29a0cbb0b3393d0621f28424] | committer: Stefano Sabatini

lavfi/overlay: add repeatlast option

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ed2c827575a665ca29a0cbb0b3393d0621f28424
---

 doc/filters.texi         |    5 +++++
 libavfilter/version.h    |    2 +-
 libavfilter/vf_overlay.c |    6 ++++++
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/doc/filters.texi b/doc/filters.texi
index d3777ef..efb3adc 100644
--- a/doc/filters.texi
+++ b/doc/filters.texi
@@ -4315,6 +4315,11 @@ Default value is @samp{yuv420}.
 If set to 1, force the filter to accept inputs in the RGB
 color space. Default value is 0. This option is deprecated, use
 @option{format} instead.
+
+ at item repeatlast
+If set to 1, force the filter to draw the last overlay frame over the
+main input until the end of the stream. A value of 0 disables this
+behavior, which is enabled by default.
 @end table
 
 The @option{x}, @option{y}, and @option{enable} expressions can
diff --git a/libavfilter/version.h b/libavfilter/version.h
index f23d9c1..b2e0b5e 100644
--- a/libavfilter/version.h
+++ b/libavfilter/version.h
@@ -30,7 +30,7 @@
 
 #define LIBAVFILTER_VERSION_MAJOR  3
 #define LIBAVFILTER_VERSION_MINOR  53
-#define LIBAVFILTER_VERSION_MICRO 100
+#define LIBAVFILTER_VERSION_MICRO 101
 
 #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
                                                LIBAVFILTER_VERSION_MINOR, \
diff --git a/libavfilter/vf_overlay.c b/libavfilter/vf_overlay.c
index 94002f5..5ac114a 100644
--- a/libavfilter/vf_overlay.c
+++ b/libavfilter/vf_overlay.c
@@ -110,6 +110,7 @@ typedef struct {
     int overlay_pix_step[4];    ///< steps per pixel for each plane of the overlay
     int hsub, vsub;             ///< chroma subsampling values
     int shortest;               ///< terminate stream when the shortest input terminates
+    int repeatlast;             ///< repeat last overlay frame
 
     double var_values[VAR_VARS_NB];
     char *x_expr, *y_expr;
@@ -561,6 +562,10 @@ static int try_filter_frame(AVFilterContext *ctx, AVFrame *mainpic)
      * before the main frame, we can drop the current overlay. */
     while (1) {
         next_overpic = ff_bufqueue_peek(&over->queue_over, 0);
+        if (!next_overpic && over->overlay_eof && !over->repeatlast) {
+            av_frame_free(&over->overpicref);
+            break;
+        }
         if (!next_overpic || av_compare_ts(next_overpic->pts, ctx->inputs[OVERLAY]->time_base,
                                            mainpic->pts     , ctx->inputs[MAIN]->time_base) > 0)
             break;
@@ -713,6 +718,7 @@ static const AVOption overlay_options[] = {
         { "yuv420", "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_YUV420}, .flags = FLAGS, .unit = "format" },
         { "yuv444", "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_YUV444}, .flags = FLAGS, .unit = "format" },
         { "rgb",    "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_RGB},    .flags = FLAGS, .unit = "format" },
+    { "repeatlast", "repeat overlay of the last overlay frame", OFFSET(repeatlast), AV_OPT_TYPE_INT, {.i64=1}, 0, 1, FLAGS },
     { NULL }
 };
 



More information about the ffmpeg-cvslog mailing list