1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

vf_aspect: switch to an AVOptions-based system.

This commit is contained in:
Anton Khirnov 2013-02-25 21:21:29 +01:00
parent e67a87eac8
commit 2831b307e6
2 changed files with 86 additions and 45 deletions

View File

@ -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 be changed by later filters in the filterchain, e.g. in case of
scaling or if another "setdar" or a "setsar" filter is applied. scaling or if another "setdar" or a "setsar" filter is applied.
The filter accepts a parameter string which represents the wanted This filter accepts the following options:
display aspect ratio.
The parameter can be a floating point number string, or an expression @table @option
of the form @var{num}:@var{den}, where @var{num} and @var{den} are the
numerator and denominator of the aspect ratio. @item dar
If the parameter is not specified, it is assumed the value "0:1". 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: For example to change the display aspect ratio to 16:9, specify:
@example @example
setdar=16:9 setdar=dar=16/9
# the above is equivalent to # the above is equivalent to
setdar=1.77777 setdar=dar=1.77777
@end example @end example
See also the @ref{setsar} filter documentation. 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" changed by later filters in the filterchain, e.g. if another "setsar"
or a "setdar" filter is applied. or a "setdar" filter is applied.
The filter accepts a parameter string which represents the wanted This filter accepts the following options:
sample aspect ratio.
The parameter can be a floating point number string, or an expression @table @option
of the form @var{num}:@var{den}, where @var{num} and @var{den} are the
numerator and denominator of the aspect ratio. @item sar
If the parameter is not specified, it is assumed the value "0:1". Output sample aspect ratio, as a rational or decimal number.
@end table
For example to change the sample aspect ratio to 10:11, specify: For example to change the sample aspect ratio to 10:11, specify:
@example @example
setsar=10:11 setsar=sar=10/11
@end example @end example
@section settb @section settb

View File

@ -23,47 +23,38 @@
* aspect ratio modification video filters * aspect ratio modification video filters
*/ */
#include <float.h>
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/mathematics.h" #include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include "avfilter.h" #include "avfilter.h"
#include "internal.h" #include "internal.h"
#include "video.h" #include "video.h"
typedef struct { typedef struct {
const AVClass *class;
AVRational aspect; AVRational aspect;
#if FF_API_OLD_FILTER_OPTS
float aspect_num, aspect_den;
#endif
} AspectContext; } AspectContext;
#if FF_API_OLD_FILTER_OPTS
static av_cold int init(AVFilterContext *ctx, const char *args) static av_cold int init(AVFilterContext *ctx, const char *args)
{ {
AspectContext *aspect = ctx->priv; AspectContext *s = ctx->priv;
double ratio;
int64_t gcd;
char c = 0;
if (args) { if (s->aspect_num > 0 && s->aspect_den > 0) {
if (sscanf(args, "%d:%d%c", &aspect->aspect.num, &aspect->aspect.den, &c) != 2) av_log(ctx, AV_LOG_WARNING, "This syntax is deprecated, use "
if (sscanf(args, "%lf%c", &ratio, &c) == 1) "dar=<number> or dar=num/den.\n");
aspect->aspect = av_d2q(ratio, 100); s->aspect = av_d2q(s->aspect_num / s->aspect_den, INT_MAX);
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 (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; return 0;
} }
#endif
static int filter_frame(AVFilterLink *link, AVFrame *frame) 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); 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 #if CONFIG_SETDAR_FILTER
/* for setdar filter, convert from frame aspect ratio to pixel aspect ratio */ /* for setdar filter, convert from frame aspect ratio to pixel aspect ratio */
static int setdar_config_props(AVFilterLink *inlink) static int setdar_config_props(AVFilterLink *inlink)
@ -80,18 +74,39 @@ static int setdar_config_props(AVFilterLink *inlink)
AspectContext *aspect = inlink->dst->priv; AspectContext *aspect = inlink->dst->priv;
AVRational dar = aspect->aspect; AVRational dar = aspect->aspect;
av_reduce(&aspect->aspect.num, &aspect->aspect.den, if (aspect->aspect.num && aspect->aspect.den) {
aspect->aspect.num * inlink->h, av_reduce(&aspect->aspect.num, &aspect->aspect.den,
aspect->aspect.den * inlink->w, 100); 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", 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->w, inlink->h, dar.num, dar.den,
inlink->sample_aspect_ratio.num, inlink->sample_aspect_ratio.den);
inlink->sample_aspect_ratio = aspect->aspect;
return 0; 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[] = { static const AVFilterPad avfilter_vf_setdar_inputs[] = {
{ {
.name = "default", .name = "default",
@ -115,9 +130,12 @@ AVFilter avfilter_vf_setdar = {
.name = "setdar", .name = "setdar",
.description = NULL_IF_CONFIG_SMALL("Set the frame display aspect ratio."), .description = NULL_IF_CONFIG_SMALL("Set the frame display aspect ratio."),
#if FF_API_OLD_FILTER_OPTS
.init = init, .init = init,
#endif
.priv_size = sizeof(AspectContext), .priv_size = sizeof(AspectContext),
.priv_class = &setdar_class,
.inputs = avfilter_vf_setdar_inputs, .inputs = avfilter_vf_setdar_inputs,
@ -136,6 +154,22 @@ static int setsar_config_props(AVFilterLink *inlink)
return 0; 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[] = { static const AVFilterPad avfilter_vf_setsar_inputs[] = {
{ {
.name = "default", .name = "default",
@ -159,9 +193,12 @@ AVFilter avfilter_vf_setsar = {
.name = "setsar", .name = "setsar",
.description = NULL_IF_CONFIG_SMALL("Set the pixel sample aspect ratio."), .description = NULL_IF_CONFIG_SMALL("Set the pixel sample aspect ratio."),
#if FF_API_OLD_FILTER_OPTS
.init = init, .init = init,
#endif
.priv_size = sizeof(AspectContext), .priv_size = sizeof(AspectContext),
.priv_class = &setsar_class,
.inputs = avfilter_vf_setsar_inputs, .inputs = avfilter_vf_setsar_inputs,