From 2831b307e65f89639ab61848d5c5d39001b22702 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 25 Feb 2013 21:21:29 +0100 Subject: [PATCH 1/2] vf_aspect: switch to an AVOptions-based system. --- doc/filters.texi | 34 ++++++++------- libavfilter/vf_aspect.c | 97 ++++++++++++++++++++++++++++------------- 2 files changed, 86 insertions(+), 45 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 1d3457ca9c..022c98468f 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -1834,18 +1834,20 @@ the video frame. Also the display aspect ratio set by this filter may be changed by later filters in the filterchain, e.g. in case of scaling or if another "setdar" or a "setsar" filter is applied. -The filter accepts a parameter string which represents the wanted -display aspect ratio. -The parameter can be a floating point number string, or an expression -of the form @var{num}:@var{den}, where @var{num} and @var{den} are the -numerator and denominator of the aspect ratio. -If the parameter is not specified, it is assumed the value "0:1". +This filter accepts the following options: + +@table @option + +@item dar +Output display aspect ratio, as a rational or a decimal number. + +@end table For example to change the display aspect ratio to 16:9, specify: @example -setdar=16:9 +setdar=dar=16/9 # the above is equivalent to -setdar=1.77777 +setdar=dar=1.77777 @end example See also the @ref{setsar} filter documentation. @@ -1929,16 +1931,18 @@ Keep in mind that the sample aspect ratio set by this filter may be changed by later filters in the filterchain, e.g. if another "setsar" or a "setdar" filter is applied. -The filter accepts a parameter string which represents the wanted -sample aspect ratio. -The parameter can be a floating point number string, or an expression -of the form @var{num}:@var{den}, where @var{num} and @var{den} are the -numerator and denominator of the aspect ratio. -If the parameter is not specified, it is assumed the value "0:1". +This filter accepts the following options: + +@table @option + +@item sar +Output sample aspect ratio, as a rational or decimal number. + +@end table For example to change the sample aspect ratio to 10:11, specify: @example -setsar=10:11 +setsar=sar=10/11 @end example @section settb diff --git a/libavfilter/vf_aspect.c b/libavfilter/vf_aspect.c index 71fb4c0fce..3fe371482f 100644 --- a/libavfilter/vf_aspect.c +++ b/libavfilter/vf_aspect.c @@ -23,47 +23,38 @@ * aspect ratio modification video filters */ +#include + #include "libavutil/common.h" #include "libavutil/mathematics.h" +#include "libavutil/opt.h" + #include "avfilter.h" #include "internal.h" #include "video.h" typedef struct { + const AVClass *class; AVRational aspect; +#if FF_API_OLD_FILTER_OPTS + float aspect_num, aspect_den; +#endif } AspectContext; +#if FF_API_OLD_FILTER_OPTS static av_cold int init(AVFilterContext *ctx, const char *args) { - AspectContext *aspect = ctx->priv; - double ratio; - int64_t gcd; - char c = 0; + AspectContext *s = ctx->priv; - if (args) { - if (sscanf(args, "%d:%d%c", &aspect->aspect.num, &aspect->aspect.den, &c) != 2) - if (sscanf(args, "%lf%c", &ratio, &c) == 1) - aspect->aspect = av_d2q(ratio, 100); - - if (c || aspect->aspect.num <= 0 || aspect->aspect.den <= 0) { - av_log(ctx, AV_LOG_ERROR, - "Invalid string '%s' for aspect ratio.\n", args); - return AVERROR(EINVAL); - } - - gcd = av_gcd(FFABS(aspect->aspect.num), FFABS(aspect->aspect.den)); - if (gcd) { - aspect->aspect.num /= gcd; - aspect->aspect.den /= gcd; - } + if (s->aspect_num > 0 && s->aspect_den > 0) { + av_log(ctx, AV_LOG_WARNING, "This syntax is deprecated, use " + "dar= or dar=num/den.\n"); + s->aspect = av_d2q(s->aspect_num / s->aspect_den, INT_MAX); } - if (aspect->aspect.den == 0) - aspect->aspect = (AVRational) {0, 1}; - - av_log(ctx, AV_LOG_VERBOSE, "a:%d/%d\n", aspect->aspect.num, aspect->aspect.den); return 0; } +#endif static int filter_frame(AVFilterLink *link, AVFrame *frame) { @@ -73,6 +64,9 @@ static int filter_frame(AVFilterLink *link, AVFrame *frame) return ff_filter_frame(link->dst->outputs[0], frame); } +#define OFFSET(x) offsetof(AspectContext, x) +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM + #if CONFIG_SETDAR_FILTER /* for setdar filter, convert from frame aspect ratio to pixel aspect ratio */ static int setdar_config_props(AVFilterLink *inlink) @@ -80,18 +74,39 @@ static int setdar_config_props(AVFilterLink *inlink) AspectContext *aspect = inlink->dst->priv; AVRational dar = aspect->aspect; - av_reduce(&aspect->aspect.num, &aspect->aspect.den, - aspect->aspect.num * inlink->h, - aspect->aspect.den * inlink->w, 100); + if (aspect->aspect.num && aspect->aspect.den) { + av_reduce(&aspect->aspect.num, &aspect->aspect.den, + aspect->aspect.num * inlink->h, + aspect->aspect.den * inlink->w, 100); + inlink->sample_aspect_ratio = aspect->aspect; + } else { + inlink->sample_aspect_ratio = (AVRational){ 1, 1 }; + dar = (AVRational){ inlink->w, inlink->h }; + } av_log(inlink->dst, AV_LOG_VERBOSE, "w:%d h:%d -> dar:%d/%d sar:%d/%d\n", - inlink->w, inlink->h, dar.num, dar.den, aspect->aspect.num, aspect->aspect.den); - - inlink->sample_aspect_ratio = aspect->aspect; + inlink->w, inlink->h, dar.num, dar.den, + inlink->sample_aspect_ratio.num, inlink->sample_aspect_ratio.den); return 0; } +static const AVOption setdar_options[] = { +#if FF_API_OLD_FILTER_OPTS + { "dar_num", NULL, OFFSET(aspect_num), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, 0, FLT_MAX, FLAGS }, + { "dar_den", NULL, OFFSET(aspect_den), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, 0, FLT_MAX, FLAGS }, +#endif + { "dar", "display aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, INT_MAX, FLAGS }, + { NULL }, +}; + +static const AVClass setdar_class = { + .class_name = "setdar", + .item_name = av_default_item_name, + .option = setdar_options, + .version = LIBAVUTIL_VERSION_INT, +}; + static const AVFilterPad avfilter_vf_setdar_inputs[] = { { .name = "default", @@ -115,9 +130,12 @@ AVFilter avfilter_vf_setdar = { .name = "setdar", .description = NULL_IF_CONFIG_SMALL("Set the frame display aspect ratio."), +#if FF_API_OLD_FILTER_OPTS .init = init, +#endif .priv_size = sizeof(AspectContext), + .priv_class = &setdar_class, .inputs = avfilter_vf_setdar_inputs, @@ -136,6 +154,22 @@ static int setsar_config_props(AVFilterLink *inlink) return 0; } +static const AVOption setsar_options[] = { +#if FF_API_OLD_FILTER_OPTS + { "sar_num", NULL, OFFSET(aspect_num), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, 0, FLT_MAX, FLAGS }, + { "sar_den", NULL, OFFSET(aspect_den), AV_OPT_TYPE_FLOAT, { .dbl = 0 }, 0, FLT_MAX, FLAGS }, +#endif + { "sar", "sample (pixel) aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, { .dbl = 1 }, 0, INT_MAX, FLAGS }, + { NULL }, +}; + +static const AVClass setsar_class = { + .class_name = "setsar", + .item_name = av_default_item_name, + .option = setsar_options, + .version = LIBAVUTIL_VERSION_INT, +}; + static const AVFilterPad avfilter_vf_setsar_inputs[] = { { .name = "default", @@ -159,9 +193,12 @@ AVFilter avfilter_vf_setsar = { .name = "setsar", .description = NULL_IF_CONFIG_SMALL("Set the pixel sample aspect ratio."), +#if FF_API_OLD_FILTER_OPTS .init = init, +#endif .priv_size = sizeof(AspectContext), + .priv_class = &setsar_class, .inputs = avfilter_vf_setsar_inputs, From 62dcdb028cc84845fd263bb09304c4c6500bda7a Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 25 Feb 2013 21:21:29 +0100 Subject: [PATCH 2/2] vf_blackframe: switch to an AVOptions-based system. --- doc/filters.texi | 18 ++++++++------ libavfilter/vf_blackframe.c | 49 +++++++++++++++++-------------------- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/doc/filters.texi b/doc/filters.texi index 022c98468f..c878472c83 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -533,16 +533,18 @@ the position in the file if known or -1 and the timestamp in seconds. In order to display the output lines, you need to set the loglevel at least to the AV_LOG_INFO value. -The filter accepts the syntax: -@example -blackframe[=@var{amount}:[@var{threshold}]] -@end example +The filter accepts the following options: -@var{amount} is the percentage of the pixels that have to be below the -threshold, and defaults to 98. +@table @option -@var{threshold} is the threshold below which a pixel value is -considered black, and defaults to 32. +@item amount +The percentage of the pixels that have to be below the threshold, defaults to +98. + +@item threshold +Threshold below which a pixel value is considered black, defaults to 32. + +@end table @section boxblur diff --git a/libavfilter/vf_blackframe.c b/libavfilter/vf_blackframe.c index 5181392b1b..54e75bbb03 100644 --- a/libavfilter/vf_blackframe.c +++ b/libavfilter/vf_blackframe.c @@ -31,14 +31,17 @@ #include #include "libavutil/internal.h" +#include "libavutil/opt.h" + #include "avfilter.h" #include "formats.h" #include "internal.h" #include "video.h" typedef struct { - unsigned int bamount; ///< black amount - unsigned int bthresh; ///< black threshold + const AVClass *class; + int bamount; ///< black amount + int bthresh; ///< black threshold unsigned int frame; ///< frame number unsigned int nblack; ///< number of black pixels counted so far } BlackFrameContext; @@ -55,29 +58,6 @@ static int query_formats(AVFilterContext *ctx) return 0; } -static av_cold int init(AVFilterContext *ctx, const char *args) -{ - BlackFrameContext *blackframe = ctx->priv; - - blackframe->bamount = 98; - blackframe->bthresh = 32; - blackframe->nblack = 0; - blackframe->frame = 0; - - if (args) - sscanf(args, "%u:%u", &blackframe->bamount, &blackframe->bthresh); - - av_log(ctx, AV_LOG_VERBOSE, "bamount:%u bthresh:%u\n", - blackframe->bamount, blackframe->bthresh); - - if (blackframe->bamount > 100 || blackframe->bthresh > 255) { - av_log(ctx, AV_LOG_ERROR, "Too big value for bamount (max is 100) or bthresh (max is 255)\n"); - return AVERROR(EINVAL); - } - - return 0; -} - static int filter_frame(AVFilterLink *inlink, AVFrame *frame) { AVFilterContext *ctx = inlink->dst; @@ -103,6 +83,23 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame) return ff_filter_frame(inlink->dst->outputs[0], frame); } +#define OFFSET(x) offsetof(BlackFrameContext, x) +#define FLAGS AV_OPT_FLAG_VIDEO_PARAM +static const AVOption options[] = { + { "amount", "Percentage of the pixels that have to be below the threshold " + "for the frame to be considered black.", OFFSET(bamount), AV_OPT_TYPE_INT, { .i64 = 98 }, 0, 100, FLAGS }, + { "threshold", "threshold below which a pixel value is considered black", + OFFSET(bthresh), AV_OPT_TYPE_INT, { .i64 = 32 }, 0, INT_MAX, FLAGS }, + { NULL }, +}; + +static const AVClass blackframe_class = { + .class_name = "blackframe", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + static const AVFilterPad avfilter_vf_blackframe_inputs[] = { { .name = "default", @@ -126,7 +123,7 @@ AVFilter avfilter_vf_blackframe = { .description = NULL_IF_CONFIG_SMALL("Detect frames that are (almost) black."), .priv_size = sizeof(BlackFrameContext), - .init = init, + .priv_class = &blackframe_class, .query_formats = query_formats,