diff --git a/doc/filters.texi b/doc/filters.texi index d3777efc4f..efb3adce80 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. + +@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 f23d9c1d2f..b2e0b5e221 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 94002f5642..5ac114aa9d 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 } };