History

Add video filter to manipulate aspect ratio

Originally committed as revision 22573 to svn://svn.ffmpeg.org/ffmpeg/trunk

Bobby Bingham committed 16 years ago

Commit 3922deb1 parent 68f0bc73 files · +140 −1Browse files

Showing the changes to libavfilter (3 of 3 files). Show all

Unified · Split

3 files
  1. libavfilter/Makefile +2 −0
  2. libavfilter/allfilters.c +3 −1
  3. libavfilter/vf_aspect.c +135 −0
libavfilter/Makefile+2−0
@@ -14,10 +14,12 @@ OBJS = allfilters.o \ · 13 unmodified lines
1414 graphparser.o \
1515 parseutils.o \
1616
17+OBJS-$(CONFIG_ASPECT_FILTER) += vf_aspect.o
1718 OBJS-$(CONFIG_CROP_FILTER) += vf_crop.o
1819 OBJS-$(CONFIG_FORMAT_FILTER) += vf_format.o
1920 OBJS-$(CONFIG_NOFORMAT_FILTER) += vf_format.o
2021 OBJS-$(CONFIG_NULL_FILTER) += vf_null.o
22+OBJS-$(CONFIG_PIXELASPECT_FILTER) += vf_aspect.o
2123 OBJS-$(CONFIG_SCALE_FILTER) += vf_scale.o
2224 OBJS-$(CONFIG_SLICIFY_FILTER) += vf_slicify.o
2325 OBJS-$(CONFIG_VFLIP_FILTER) += vf_vflip.o
libavfilter/allfilters.c+3−1
@@ -34,15 +34,17 @@ void avfilter_register_all(void) · 33 unmodified lines
3434 return;
3535 initialized = 1;
3636
37+ REGISTER_FILTER (ASPECT, aspect, vf);
3738 REGISTER_FILTER (CROP, crop, vf);
3839 REGISTER_FILTER (FORMAT, format, vf);
3940 REGISTER_FILTER (NOFORMAT, noformat, vf);
4041 REGISTER_FILTER (NULL, null, vf);
42+ REGISTER_FILTER (PIXELASPECT, pixelaspect, vf);
4143 REGISTER_FILTER (SCALE, scale, vf);
4244 REGISTER_FILTER (SLICIFY, slicify, vf);
4345 REGISTER_FILTER (VFLIP, vflip, vf);
4446
4547 REGISTER_FILTER (NULLSRC, nullsrc, vsrc);
4648
47− REGISTER_FILTER(NULLSINK, nullsink, vsink);
49+ REGISTER_FILTER (NULLSINK, nullsink, vsink);
4850 }
libavfilter/vf_aspect.c+135−0
@@ -0,0 +1,135 @@
1+/*
2+ * Aspect ratio modification video filter
3+ * Copyright (c) 2010 Bobby Bingham
4+
5+ * This file is part of FFmpeg.
6+ *
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.
11+ *
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.
16+ *
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
20+ */
21+
22+/**
23+ * @file libavfilter/vf_aspect.c
24+ * aspect ratio modification video filter
25+ */
26+
27+#include "avfilter.h"
28+
29+typedef struct {
30+ AVRational aspect;
31+} AspectContext;
32+
33+static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
34+{
35+ AspectContext *aspect = ctx->priv;
36+ double ratio;
37+ int64_t gcd;
38+
39+ if(args) {
40+ if(sscanf(args, "%d:%d", &aspect->aspect.num, &aspect->aspect.den) < 2) {
41+ if(sscanf(args, "%lf", &ratio) < 1)
42+ return -1;
43+ aspect->aspect = av_d2q(ratio, 100);
44+ } else {
45+ gcd = av_gcd(FFABS(aspect->aspect.num), FFABS(aspect->aspect.den));
46+ if(gcd) {
47+ aspect->aspect.num /= gcd;
48+ aspect->aspect.den /= gcd;
49+ }
50+ }
51+ }
52+
53+ if(aspect->aspect.den == 0)
54+ aspect->aspect = (AVRational) {0, 1};
55+
56+ return 0;
57+}
58+
59+
60+static AVFilterPicRef *get_video_buffer(AVFilterLink *link, int perms,
61+ int w, int h)
62+{
63+ return avfilter_get_video_buffer(link->dst->outputs[0], perms, w, h);
64+}
65+
66+static void start_frame(AVFilterLink *link, AVFilterPicRef *picref)
67+{
68+ AspectContext *aspect = link->dst->priv;
69+
70+ picref->pixel_aspect = aspect->aspect;
71+ avfilter_start_frame(link->dst->outputs[0], picref);
72+}
73+
74+static void end_frame(AVFilterLink *link)
75+{
76+ avfilter_end_frame(link->dst->outputs[0]);
77+}
78+
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)
82+{
83+ AspectContext *aspect = inlink->dst->priv;
84+
85+ av_reduce(&aspect->aspect.num, &aspect->aspect.den,
86+ aspect->aspect.num * inlink->h,
87+ aspect->aspect.den * inlink->w, 100);
88+
89+ return 0;
90+}
91+
92+AVFilter avfilter_vf_aspect = {
93+ .name = "aspect",
94+ .description = NULL_IF_CONFIG_SMALL("Set the frame aspect ratio."),
95+
96+ .init = init,
97+
98+ .priv_size = sizeof(AspectContext),
99+
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 },
106+ { .name = NULL}},
107+
108+ .outputs = (AVFilterPad[]) {{ .name = "default",
109+ .type = CODEC_TYPE_VIDEO, },
110+ { .name = NULL}},
111+};
112+#endif /* CONFIG_ASPECT_FILTER */
113+
114+#if CONFIG_PIXELASPECT_FILTER
115+AVFilter avfilter_vf_pixelaspect = {
116+ .name = "pixelaspect",
117+ .description = NULL_IF_CONFIG_SMALL("Set the pixel aspect ratio."),
118+
119+ .init = init,
120+
121+ .priv_size = sizeof(AspectContext),
122+
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 },
128+ { .name = NULL}},
129+
130+ .outputs = (AVFilterPad[]) {{ .name = "default",
131+ .type = CODEC_TYPE_VIDEO, },
132+ { .name = NULL}},
133+};
134+#endif /* CONFIG_PIXELASPECT_FILTER */
135+

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t