From 95f1f56a21bc2f824af6fb97ca7ab35cdd0c401e Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 25 Feb 2013 21:21:29 +0100 Subject: [PATCH] vf_select: switch to an AVOptions-based system. --- doc/filters.texi | 19 +++++++++++++------ libavfilter/vf_select.c | 23 +++++++++++++++++++++-- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 5cb29235ba..037d6ad492 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1742,9 +1742,16 @@ scale=w='min(500\, iw*3/2):h=-1' @section select Select frames to pass in output. -It accepts in input an expression, which is evaluated for each input -frame. If the expression is evaluated to a non-zero value, the frame -is selected and passed to the output, otherwise it is discarded. +This filter accepts the following options: + +@table @option + +@item expr +An expression, which is evaluated for each input frame. If the expression is +evaluated to a non-zero value, the frame is selected and passed to the output, +otherwise it is discarded. + +@end table The expression can contain the following constants: @@ -1831,13 +1838,13 @@ Some examples follow: select # the above is the same as: -select=1 +select=expr=1 # skip all frames: -select=0 +select=expr=0 # select only I-frames -select='eq(pict_type\,I)' +select='expr=eq(pict_type\,I)' # select one frame every 100 select='not(mod(n\,100))' diff --git a/libavfilter/vf_select.c b/libavfilter/vf_select.c index 7839e44168..ce56e33757 100644 --- a/libavfilter/vf_select.c +++ b/libavfilter/vf_select.c @@ -27,6 +27,7 @@ #include "libavutil/fifo.h" #include "libavutil/internal.h" #include "libavutil/mathematics.h" +#include "libavutil/opt.h" #include "avfilter.h" #include "internal.h" #include "video.h" @@ -115,6 +116,8 @@ enum var_name { #define FIFO_SIZE 8 typedef struct { + const AVClass *class; + char *expr_str; AVExpr *expr; double var_values[VAR_VARS_NB]; double select; @@ -127,9 +130,10 @@ static av_cold int init(AVFilterContext *ctx, const char *args) SelectContext *select = ctx->priv; int ret; - if ((ret = av_expr_parse(&select->expr, args ? args : "1", + if ((ret = av_expr_parse(&select->expr, select->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", + select->expr_str); return ret; } @@ -309,6 +313,20 @@ static av_cold void uninit(AVFilterContext *ctx) select->pending_frames = NULL; } +#define OFFSET(x) offsetof(SelectContext, x) +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM +static const AVOption options[] = { + { "expr", "An expression to use for selecting frames", OFFSET(expr_str), AV_OPT_TYPE_STRING, { .str = "1" }, .flags = FLAGS }, + { NULL }, +}; + +static const AVClass select_class = { + .class_name = "select", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + static const AVFilterPad avfilter_vf_select_inputs[] = { { .name = "default", @@ -337,6 +355,7 @@ AVFilter avfilter_vf_select = { .uninit = uninit, .priv_size = sizeof(SelectContext), + .priv_class = &select_class, .inputs = avfilter_vf_select_inputs, .outputs = avfilter_vf_select_outputs,