2 * Aspect ratio modification video filter
3 * Copyright (c) 2010 Bobby Bingham
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * @file libavfilter/vf_aspect.c
24 * aspect ratio modification video filter
33 static av_cold
int init(AVFilterContext
*ctx
, const char *args
, void *opaque
)
35 AspectContext
*aspect
= ctx
->priv
;
40 if(sscanf(args
, "%d:%d", &aspect
->aspect
.num
, &aspect
->aspect
.den
) < 2) {
41 if(sscanf(args
, "%lf", &ratio
) < 1)
43 aspect
->aspect
= av_d2q(ratio
, 100);
45 gcd
= av_gcd(FFABS(aspect
->aspect
.num
), FFABS(aspect
->aspect
.den
));
47 aspect
->aspect
.num
/= gcd
;
48 aspect
->aspect
.den
/= gcd
;
53 if(aspect
->aspect
.den
== 0)
54 aspect
->aspect
= (AVRational
) {0, 1};
60 static AVFilterPicRef
*get_video_buffer(AVFilterLink
*link
, int perms
,
63 return avfilter_get_video_buffer(link
->dst
->outputs
[0], perms
, w
, h
);
66 static void start_frame(AVFilterLink
*link
, AVFilterPicRef
*picref
)
68 AspectContext
*aspect
= link
->dst
->priv
;
70 picref
->pixel_aspect
= aspect
->aspect
;
71 avfilter_start_frame(link
->dst
->outputs
[0], picref
);
74 static void end_frame(AVFilterLink
*link
)
76 avfilter_end_frame(link
->dst
->outputs
[0]);
79 #if CONFIG_ASPECT_FILTER
80 /* for aspect filter, convert from frame aspect ratio to pixel aspect ratio */
81 static int frameaspect_config_props(AVFilterLink
*inlink
)
83 AspectContext
*aspect
= inlink
->dst
->priv
;
85 av_reduce(&aspect
->aspect
.num
, &aspect
->aspect
.den
,
86 aspect
->aspect
.num
* inlink
->h
,
87 aspect
->aspect
.den
* inlink
->w
, 100);
92 AVFilter avfilter_vf_aspect
= {
94 .description
= NULL_IF_CONFIG_SMALL("Set the frame aspect ratio."),
98 .priv_size
= sizeof(AspectContext
),
100 .inputs
= (AVFilterPad
[]) {{ .name
= "default",
101 .type
= CODEC_TYPE_VIDEO
,
102 .config_props
= frameaspect_config_props
,
103 .get_video_buffer
= get_video_buffer
,
104 .start_frame
= start_frame
,
105 .end_frame
= end_frame
},
108 .outputs
= (AVFilterPad
[]) {{ .name
= "default",
109 .type
= CODEC_TYPE_VIDEO
, },
112 #endif /* CONFIG_ASPECT_FILTER */
114 #if CONFIG_PIXELASPECT_FILTER
115 AVFilter avfilter_vf_pixelaspect
= {
116 .name
= "pixelaspect",
117 .description
= NULL_IF_CONFIG_SMALL("Set the pixel aspect ratio."),
121 .priv_size
= sizeof(AspectContext
),
123 .inputs
= (AVFilterPad
[]) {{ .name
= "default",
124 .type
= CODEC_TYPE_VIDEO
,
125 .get_video_buffer
= get_video_buffer
,
126 .start_frame
= start_frame
,
127 .end_frame
= end_frame
},
130 .outputs
= (AVFilterPad
[]) {{ .name
= "default",
131 .type
= CODEC_TYPE_VIDEO
, },
134 #endif /* CONFIG_PIXELASPECT_FILTER */