lavfi/overlay: add repeatlast option

This commit is contained in:
Stefano Sabatini 2013-04-05 13:49:20 +02:00
parent a77454ec14
commit ed2c827575
3 changed files with 12 additions and 1 deletions

View File

@ -4315,6 +4315,11 @@ Default value is @samp{yuv420}.
If set to 1, force the filter to accept inputs in the RGB If set to 1, force the filter to accept inputs in the RGB
color space. Default value is 0. This option is deprecated, use color space. Default value is 0. This option is deprecated, use
@option{format} instead. @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 @end table
The @option{x}, @option{y}, and @option{enable} expressions can The @option{x}, @option{y}, and @option{enable} expressions can

View File

@ -30,7 +30,7 @@
#define LIBAVFILTER_VERSION_MAJOR 3 #define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 53 #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, \ #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \ LIBAVFILTER_VERSION_MINOR, \

View File

@ -110,6 +110,7 @@ typedef struct {
int overlay_pix_step[4]; ///< steps per pixel for each plane of the overlay int overlay_pix_step[4]; ///< steps per pixel for each plane of the overlay
int hsub, vsub; ///< chroma subsampling values int hsub, vsub; ///< chroma subsampling values
int shortest; ///< terminate stream when the shortest input terminates int shortest; ///< terminate stream when the shortest input terminates
int repeatlast; ///< repeat last overlay frame
double var_values[VAR_VARS_NB]; double var_values[VAR_VARS_NB];
char *x_expr, *y_expr; 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. */ * before the main frame, we can drop the current overlay. */
while (1) { while (1) {
next_overpic = ff_bufqueue_peek(&over->queue_over, 0); 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, if (!next_overpic || av_compare_ts(next_overpic->pts, ctx->inputs[OVERLAY]->time_base,
mainpic->pts , ctx->inputs[MAIN]->time_base) > 0) mainpic->pts , ctx->inputs[MAIN]->time_base) > 0)
break; break;
@ -713,6 +718,7 @@ static const AVOption overlay_options[] = {
{ "yuv420", "", 0, AV_OPT_TYPE_CONST, {.i64=OVERLAY_FORMAT_YUV420}, .flags = FLAGS, .unit = "format" }, { "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" }, { "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" }, { "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 } { NULL }
}; };