This is heavily based on 2831b307
by Anton Khirnov <anton@khirnov.net>
tags/n2.0
@@ -5030,18 +5030,10 @@ Keep in mind that the sample aspect ratio set by the @code{setsar} | |||||
filter may be changed by later filters in the filterchain, e.g. if | filter may be changed by later filters in the filterchain, e.g. if | ||||
another "setsar" or a "setdar" filter is applied. | another "setsar" or a "setdar" filter is applied. | ||||
The @code{setdar} and @code{setsar} filters accept a string in the | |||||
form @var{num}:@var{den} expressing an aspect ratio, or the following | |||||
named options, expressed as a sequence of @var{key}=@var{value} pairs, | |||||
separated by ":". | |||||
The filters accept the following options: | |||||
@table @option | @table @option | ||||
@item max | |||||
Set the maximum integer value to use for expressing numerator and | |||||
denominator when reducing the expressed aspect ratio to a rational. | |||||
Default value is @code{100}. | |||||
@item r, ratio, dar, sar: | |||||
@item r, ratio, dar (@code{setdar} only), sar (@code{setsar} only) | |||||
Set the aspect ratio used by the filter. | Set the aspect ratio used by the filter. | ||||
The parameter can be a floating point number string, an expression, or | The parameter can be a floating point number string, an expression, or | ||||
@@ -5050,33 +5042,41 @@ a string of the form @var{num}:@var{den}, where @var{num} and | |||||
the parameter is not specified, it is assumed the value "0". | the parameter is not specified, it is assumed the value "0". | ||||
In case the form "@var{num}:@var{den}" the @code{:} character should | In case the form "@var{num}:@var{den}" the @code{:} character should | ||||
be escaped. | be escaped. | ||||
@item max | |||||
Set the maximum integer value to use for expressing numerator and | |||||
denominator when reducing the expressed aspect ratio to a rational. | |||||
Default value is @code{100}. | |||||
@end table | @end table | ||||
If the keys are omitted in the named options list, the specifed values | |||||
are assumed to be @var{ratio} and @var{max} in that order. | |||||
@subsection Examples | |||||
For example to change the display aspect ratio to 16:9, specify: | |||||
@itemize | |||||
@item | |||||
To change the display aspect ratio to 16:9, specify one of the following: | |||||
@example | @example | ||||
setdar='16:9' | |||||
# the above is equivalent to | |||||
setdar=1.77777 | |||||
setdar=dar=1.77777 | |||||
setdar=dar=16/9 | setdar=dar=16/9 | ||||
setdar=dar=1.77777 | setdar=dar=1.77777 | ||||
@end example | @end example | ||||
@item | |||||
To change the sample aspect ratio to 10:11, specify: | To change the sample aspect ratio to 10:11, specify: | ||||
@example | @example | ||||
setsar='10:11' | |||||
# the above is equivalent to | |||||
setsar='sar=10/11' | |||||
setsar=sar=10/11 | |||||
@end example | @end example | ||||
@item | |||||
To set a display aspect ratio of 16:9, and specify a maximum integer value of | To set a display aspect ratio of 16:9, and specify a maximum integer value of | ||||
1000 in the aspect ratio reduction, use the command: | 1000 in the aspect ratio reduction, use the command: | ||||
@example | @example | ||||
setdar=ratio='16:9':max=1000 | |||||
setdar=ratio=16/9:max=1000 | |||||
@end example | @end example | ||||
@end itemize | |||||
@anchor{setfield} | @anchor{setfield} | ||||
@section setfield | @section setfield | ||||
@@ -681,8 +681,6 @@ static const char *const filters_left_to_update[] = { | |||||
"mp", | "mp", | ||||
"pan", | "pan", | ||||
"scale", | "scale", | ||||
"setdar", | |||||
"setsar", | |||||
}; | }; | ||||
static int filter_use_deprecated_init(const char *name) | static int filter_use_deprecated_init(const char *name) | ||||
@@ -38,7 +38,6 @@ | |||||
typedef struct { | typedef struct { | ||||
const AVClass *class; | const AVClass *class; | ||||
AVRational aspect; | AVRational aspect; | ||||
char *ratio_str; | |||||
int max; | int max; | ||||
#if FF_API_OLD_FILTER_OPTS | #if FF_API_OLD_FILTER_OPTS | ||||
float aspect_num, aspect_den; | float aspect_num, aspect_den; | ||||
@@ -49,26 +48,11 @@ typedef struct { | |||||
static av_cold int init(AVFilterContext *ctx, const char *args) | static av_cold int init(AVFilterContext *ctx, const char *args) | ||||
{ | { | ||||
AspectContext *s = ctx->priv; | AspectContext *s = ctx->priv; | ||||
static const char *shorthand[] = { "ratio", "max", NULL }; | |||||
char c; | |||||
int ret; | |||||
AVRational q; | |||||
if (args && sscanf(args, "%d:%d%c", &q.num, &q.den, &c) == 2) { | |||||
s->ratio_str = av_strdup(args); | |||||
if (s->aspect_num > 0 && s->aspect_den > 0) { | |||||
av_log(ctx, AV_LOG_WARNING, | av_log(ctx, AV_LOG_WARNING, | ||||
"num:den syntax is deprecated, please use num/den or named options instead\n"); | "num:den syntax is deprecated, please use num/den or named options instead\n"); | ||||
} else if ((ret = av_opt_set_from_string(s, args, shorthand, "=", ":")) < 0) { | |||||
return ret; | |||||
} | |||||
if (s->ratio_str) { | |||||
ret = av_parse_ratio(&s->aspect, s->ratio_str, s->max, 0, ctx); | |||||
if (ret < 0 || s->aspect.num < 0 || s->aspect.den <= 0) { | |||||
av_log(ctx, AV_LOG_ERROR, | |||||
"Invalid string '%s' for aspect ratio\n", args); | |||||
return AVERROR(EINVAL); | |||||
} | |||||
s->aspect = av_d2q(s->aspect_num / s->aspect_den, INT_MAX); | |||||
} | } | ||||
return 0; | return 0; | ||||
@@ -111,11 +95,15 @@ static int setdar_config_props(AVFilterLink *inlink) | |||||
} | } | ||||
static const AVOption setdar_options[] = { | static const AVOption setdar_options[] = { | ||||
{"max", "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS }, | |||||
{"ratio", "display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, | |||||
{"r", "display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, | |||||
{"dar", "display aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, | |||||
{NULL} | |||||
#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", "set display aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS }, | |||||
{ "ratio", "set display aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS }, | |||||
{ "r", "set display aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS }, | |||||
{ "max", "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS }, | |||||
{ NULL } | |||||
}; | }; | ||||
AVFILTER_DEFINE_CLASS(setdar); | AVFILTER_DEFINE_CLASS(setdar); | ||||
@@ -170,11 +158,15 @@ static int setsar_config_props(AVFilterLink *inlink) | |||||
} | } | ||||
static const AVOption setsar_options[] = { | static const AVOption setsar_options[] = { | ||||
{"max", "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS }, | |||||
{"ratio", "sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, | |||||
{"r", "sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, | |||||
{"sar", "sample (pixel) aspect ratio", OFFSET(ratio_str), AV_OPT_TYPE_STRING, {.str="0"}, 0, 0, FLAGS }, | |||||
{NULL} | |||||
#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", "set sample (pixel) aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS }, | |||||
{ "ratio", "set sample (pixel) aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS }, | |||||
{ "r", "set sample (pixel) aspect ratio", OFFSET(aspect), AV_OPT_TYPE_RATIONAL, {.dbl=0}, 0, INT_MAX, FLAGS }, | |||||
{ "max", "set max value for nominator or denominator in the ratio", OFFSET(max), AV_OPT_TYPE_INT, {.i64=100}, 1, INT_MAX, FLAGS }, | |||||
{ NULL } | |||||
}; | }; | ||||
AVFILTER_DEFINE_CLASS(setsar); | AVFILTER_DEFINE_CLASS(setsar); | ||||
@@ -60,8 +60,8 @@ do_lavfi "pp6" "pp=be/fd" | |||||
do_lavfi "scale200" "scale=200:200" | do_lavfi "scale200" "scale=200:200" | ||||
do_lavfi "scale500" "scale=500:500" | do_lavfi "scale500" "scale=500:500" | ||||
do_lavfi "select" "select=not(eq(mod(n\,2)\,0)+eq(mod(n\,3)\,0))" | do_lavfi "select" "select=not(eq(mod(n\,2)\,0)+eq(mod(n\,3)\,0))" | ||||
do_lavfi "setdar" "setdar=16/9" | |||||
do_lavfi "setsar" "setsar=16/11" | |||||
do_lavfi "setdar" "setdar=dar=16/9" | |||||
do_lavfi "setsar" "setsar=sar=16/11" | |||||
do_lavfi "thumbnail" "thumbnail=10" | do_lavfi "thumbnail" "thumbnail=10" | ||||
do_lavfi "tile" "tile=3x3:nb_frames=5:padding=7:margin=2" | do_lavfi "tile" "tile=3x3:nb_frames=5:padding=7:margin=2" | ||||
do_lavfi "transpose" "transpose" | do_lavfi "transpose" "transpose" | ||||