From 33b97faaba2744f0a2fd65c0ef9ecc2de3fad7ff Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 25 Feb 2013 21:21:29 +0100 Subject: [PATCH] vf_setpts: switch to an AVOptions-based system. --- doc/filters.texi | 17 +++++++++++++---- libavfilter/vf_setpts.c | 22 ++++++++++++++++++++-- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 037d6ad492..0c7527fd11 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1895,8 +1895,17 @@ See also the @ref{setsar} filter documentation. Change the PTS (presentation timestamp) of the input video frames. -Accept in input an expression evaluated through the eval API, which -can contain the following constants: +This filter accepts the following options: + +@table @option + +@item expr +The expression which is evaluated for each frame to construct its timestamp. + +@end table + +The expression is evaluated through the eval API and can contain the following +constants: @table @option @item PTS @@ -1938,10 +1947,10 @@ Some examples follow: @example # start counting PTS from zero -setpts=PTS-STARTPTS +setpts=expr=PTS-STARTPTS # fast motion -setpts=0.5*PTS +setpts=expr=0.5*PTS # slow motion setpts=2.0*PTS diff --git a/libavfilter/vf_setpts.c b/libavfilter/vf_setpts.c index 02fb4bd0c5..98947a6816 100644 --- a/libavfilter/vf_setpts.c +++ b/libavfilter/vf_setpts.c @@ -29,6 +29,7 @@ #include "libavutil/eval.h" #include "libavutil/internal.h" #include "libavutil/mathematics.h" +#include "libavutil/opt.h" #include "libavutil/time.h" #include "avfilter.h" #include "internal.h" @@ -67,6 +68,8 @@ enum var_name { }; typedef struct { + const AVClass *class; + char *expr_str; AVExpr *expr; double var_values[VAR_VARS_NB]; } SetPTSContext; @@ -76,9 +79,9 @@ static av_cold int init(AVFilterContext *ctx, const char *args) SetPTSContext *setpts = ctx->priv; int ret; - if ((ret = av_expr_parse(&setpts->expr, args ? args : "PTS", + if ((ret = av_expr_parse(&setpts->expr, setpts->expr_str, var_names, NULL, NULL, NULL, NULL, 0, ctx)) < 0) { - av_log(ctx, AV_LOG_ERROR, "Error while parsing expression '%s'\n", args); + av_log(ctx, AV_LOG_ERROR, "Error while parsing expression '%s'\n", setpts->expr_str); return ret; } @@ -145,6 +148,20 @@ static av_cold void uninit(AVFilterContext *ctx) setpts->expr = NULL; } +#define OFFSET(x) offsetof(SetPTSContext, x) +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM +static const AVOption options[] = { + { "expr", "Expression determining the frame timestamp", OFFSET(expr_str), AV_OPT_TYPE_STRING, { .str = "PTS" }, .flags = FLAGS }, + { NULL }, +}; + +static const AVClass setpts_class = { + .class_name = "setpts", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + static const AVFilterPad avfilter_vf_setpts_inputs[] = { { .name = "default", @@ -171,6 +188,7 @@ AVFilter avfilter_vf_setpts = { .uninit = uninit, .priv_size = sizeof(SetPTSContext), + .priv_class = &setpts_class, .inputs = avfilter_vf_setpts_inputs, .outputs = avfilter_vf_setpts_outputs,