2 * Copyright (c) 2010 Bobby Bingham
4 * This file is part of Libav.
6 * Libav is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * Libav is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with Libav; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * aspect ratio modification video filters
26 #include "libavutil/common.h"
27 #include "libavutil/mathematics.h"
36 static av_cold
int init(AVFilterContext
*ctx
, const char *args
)
38 AspectContext
*aspect
= ctx
->priv
;
44 if (sscanf(args
, "%d:%d%c", &aspect
->aspect
.num
, &aspect
->aspect
.den
, &c
) != 2)
45 if (sscanf(args
, "%lf%c", &ratio
, &c
) == 1)
46 aspect
->aspect
= av_d2q(ratio
, 100);
48 if (c
|| aspect
->aspect
.num
<= 0 || aspect
->aspect
.den
<= 0) {
49 av_log(ctx
, AV_LOG_ERROR
,
50 "Invalid string '%s' for aspect ratio.\n", args
);
51 return AVERROR(EINVAL
);
54 gcd
= av_gcd(FFABS(aspect
->aspect
.num
), FFABS(aspect
->aspect
.den
));
56 aspect
->aspect
.num
/= gcd
;
57 aspect
->aspect
.den
/= gcd
;
61 if (aspect
->aspect
.den
== 0)
62 aspect
->aspect
= (AVRational
) {0, 1};
64 av_log(ctx
, AV_LOG_VERBOSE
, "a:%d/%d\n", aspect
->aspect
.num
, aspect
->aspect
.den
);
68 static int filter_frame(AVFilterLink
*link
, AVFrame
*frame
)
70 AspectContext
*aspect
= link
->dst
->priv
;
72 frame
->sample_aspect_ratio
= aspect
->aspect
;
73 return ff_filter_frame(link
->dst
->outputs
[0], frame
);
76 #if CONFIG_SETDAR_FILTER
77 /* for setdar filter, convert from frame aspect ratio to pixel aspect ratio */
78 static int setdar_config_props(AVFilterLink
*inlink
)
80 AspectContext
*aspect
= inlink
->dst
->priv
;
81 AVRational dar
= aspect
->aspect
;
83 av_reduce(&aspect
->aspect
.num
, &aspect
->aspect
.den
,
84 aspect
->aspect
.num
* inlink
->h
,
85 aspect
->aspect
.den
* inlink
->w
, 100);
87 av_log(inlink
->dst
, AV_LOG_VERBOSE
, "w:%d h:%d -> dar:%d/%d sar:%d/%d\n",
88 inlink
->w
, inlink
->h
, dar
.num
, dar
.den
, aspect
->aspect
.num
, aspect
->aspect
.den
);
90 inlink
->sample_aspect_ratio
= aspect
->aspect
;
95 static const AVFilterPad avfilter_vf_setdar_inputs
[] = {
98 .type
= AVMEDIA_TYPE_VIDEO
,
99 .config_props
= setdar_config_props
,
100 .get_video_buffer
= ff_null_get_video_buffer
,
101 .filter_frame
= filter_frame
,
106 static const AVFilterPad avfilter_vf_setdar_outputs
[] = {
109 .type
= AVMEDIA_TYPE_VIDEO
,
114 AVFilter avfilter_vf_setdar
= {
116 .description
= NULL_IF_CONFIG_SMALL("Set the frame display aspect ratio."),
120 .priv_size
= sizeof(AspectContext
),
122 .inputs
= avfilter_vf_setdar_inputs
,
124 .outputs
= avfilter_vf_setdar_outputs
,
126 #endif /* CONFIG_SETDAR_FILTER */
128 #if CONFIG_SETSAR_FILTER
129 /* for setdar filter, convert from frame aspect ratio to pixel aspect ratio */
130 static int setsar_config_props(AVFilterLink
*inlink
)
132 AspectContext
*aspect
= inlink
->dst
->priv
;
134 inlink
->sample_aspect_ratio
= aspect
->aspect
;
139 static const AVFilterPad avfilter_vf_setsar_inputs
[] = {
142 .type
= AVMEDIA_TYPE_VIDEO
,
143 .config_props
= setsar_config_props
,
144 .get_video_buffer
= ff_null_get_video_buffer
,
145 .filter_frame
= filter_frame
,
150 static const AVFilterPad avfilter_vf_setsar_outputs
[] = {
153 .type
= AVMEDIA_TYPE_VIDEO
,
158 AVFilter avfilter_vf_setsar
= {
160 .description
= NULL_IF_CONFIG_SMALL("Set the pixel sample aspect ratio."),
164 .priv_size
= sizeof(AspectContext
),
166 .inputs
= avfilter_vf_setsar_inputs
,
168 .outputs
= avfilter_vf_setsar_outputs
,
170 #endif /* CONFIG_SETSAR_FILTER */