Commit | Line | Data |
---|---|---|
bf4ce7a3 VS |
1 | /* |
2 | * Filter layer - default implementations | |
3 | * copyright (c) 2007 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 | ||
245976da | 22 | #include "libavcodec/imgconvert.h" |
bf4ce7a3 VS |
23 | #include "avfilter.h" |
24 | ||
25 | /* TODO: buffer pool. see comment for avfilter_default_get_video_buffer() */ | |
1250fcc8 | 26 | static void avfilter_default_free_video_buffer(AVFilterPic *pic) |
bf4ce7a3 | 27 | { |
790a03d7 | 28 | av_free(pic->data[0]); |
bf4ce7a3 VS |
29 | av_free(pic); |
30 | } | |
31 | ||
32 | /* TODO: set the buffer's priv member to a context structure for the whole | |
33 | * filter chain. This will allow for a buffer pool instead of the constant | |
34 | * alloc & free cycle currently implemented. */ | |
0eb4ff9e | 35 | AVFilterPicRef *avfilter_default_get_video_buffer(AVFilterLink *link, int perms, int w, int h) |
bf4ce7a3 VS |
36 | { |
37 | AVFilterPic *pic = av_mallocz(sizeof(AVFilterPic)); | |
38 | AVFilterPicRef *ref = av_mallocz(sizeof(AVFilterPicRef)); | |
790a03d7 VS |
39 | int i, tempsize; |
40 | char *buf; | |
bf4ce7a3 VS |
41 | |
42 | ref->pic = pic; | |
0eb4ff9e SS |
43 | ref->w = pic->w = w; |
44 | ref->h = pic->h = h; | |
4f909565 VS |
45 | |
46 | /* make sure the buffer gets read permission or it's useless for output */ | |
47 | ref->perms = perms | AV_PERM_READ; | |
bf4ce7a3 VS |
48 | |
49 | pic->refcount = 1; | |
50 | pic->format = link->format; | |
51 | pic->free = avfilter_default_free_video_buffer; | |
790a03d7 VS |
52 | ff_fill_linesize((AVPicture *)pic, pic->format, ref->w); |
53 | ||
54 | for (i=0; i<4;i++) | |
ef516f73 | 55 | pic->linesize[i] = FFALIGN(pic->linesize[i], 16); |
790a03d7 VS |
56 | |
57 | tempsize = ff_fill_pointer((AVPicture *)pic, NULL, pic->format, ref->h); | |
58 | buf = av_malloc(tempsize); | |
59 | ff_fill_pointer((AVPicture *)pic, buf, pic->format, ref->h); | |
bf4ce7a3 VS |
60 | |
61 | memcpy(ref->data, pic->data, sizeof(pic->data)); | |
62 | memcpy(ref->linesize, pic->linesize, sizeof(pic->linesize)); | |
63 | ||
64 | return ref; | |
65 | } | |
66 | ||
67 | void avfilter_default_start_frame(AVFilterLink *link, AVFilterPicRef *picref) | |
68 | { | |
69 | AVFilterLink *out = NULL; | |
70 | ||
71 | if(link->dst->output_count) | |
72 | out = link->dst->outputs[0]; | |
73 | ||
bf4ce7a3 | 74 | if(out) { |
b5eab66e | 75 | out->outpic = avfilter_get_video_buffer(out, AV_PERM_WRITE, out->w, out->h); |
bf4ce7a3 | 76 | out->outpic->pts = picref->pts; |
5bb5c1dc | 77 | out->outpic->pos = picref->pos; |
3b2142af | 78 | out->outpic->pixel_aspect = picref->pixel_aspect; |
23274667 | 79 | avfilter_start_frame(out, avfilter_ref_pic(out->outpic, ~0)); |
bf4ce7a3 VS |
80 | } |
81 | } | |
82 | ||
a13a5437 | 83 | void avfilter_default_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) |
b9609848 SS |
84 | { |
85 | AVFilterLink *out = NULL; | |
86 | ||
87 | if(link->dst->output_count) | |
88 | out = link->dst->outputs[0]; | |
89 | ||
90 | if(out) | |
a13a5437 | 91 | avfilter_draw_slice(out, y, h, slice_dir); |
b9609848 SS |
92 | } |
93 | ||
bf4ce7a3 VS |
94 | void avfilter_default_end_frame(AVFilterLink *link) |
95 | { | |
96 | AVFilterLink *out = NULL; | |
97 | ||
98 | if(link->dst->output_count) | |
99 | out = link->dst->outputs[0]; | |
100 | ||
101 | avfilter_unref_pic(link->cur_pic); | |
102 | link->cur_pic = NULL; | |
103 | ||
104 | if(out) { | |
552c0208 | 105 | if(out->outpic) { |
fc0f39c2 VS |
106 | avfilter_unref_pic(out->outpic); |
107 | out->outpic = NULL; | |
552c0208 | 108 | } |
bf4ce7a3 VS |
109 | avfilter_end_frame(out); |
110 | } | |
111 | } | |
112 | ||
113 | /** | |
114 | * default config_link() implementation for output video links to simplify | |
115 | * the implementation of one input one output video filters */ | |
116 | int avfilter_default_config_output_link(AVFilterLink *link) | |
117 | { | |
118 | if(link->src->input_count && link->src->inputs[0]) { | |
119 | link->w = link->src->inputs[0]->w; | |
120 | link->h = link->src->inputs[0]->h; | |
121 | } else { | |
122 | /* XXX: any non-simple filter which would cause this branch to be taken | |
123 | * really should implement its own config_props() for this link. */ | |
d0e4eba5 | 124 | return -1; |
bf4ce7a3 VS |
125 | } |
126 | ||
127 | return 0; | |
128 | } | |
129 | ||
130 | /** | |
e363730c VS |
131 | * A helper for query_formats() which sets all links to the same list of |
132 | * formats. If there are no links hooked to this filter, the list of formats is | |
133 | * freed. | |
134 | * | |
135 | * FIXME: this will need changed for filters with a mix of pad types | |
136 | * (video + audio, etc) | |
137 | */ | |
138 | void avfilter_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats) | |
bf4ce7a3 | 139 | { |
e363730c VS |
140 | int count = 0, i; |
141 | ||
142 | for(i = 0; i < ctx->input_count; i ++) { | |
143 | if(ctx->inputs[i]) { | |
144 | avfilter_formats_ref(formats, &ctx->inputs[i]->out_formats); | |
145 | count ++; | |
146 | } | |
147 | } | |
148 | for(i = 0; i < ctx->output_count; i ++) { | |
149 | if(ctx->outputs[i]) { | |
150 | avfilter_formats_ref(formats, &ctx->outputs[i]->in_formats); | |
151 | count ++; | |
152 | } | |
153 | } | |
154 | ||
155 | if(!count) { | |
156 | av_free(formats->formats); | |
157 | av_free(formats->refs); | |
158 | av_free(formats); | |
159 | } | |
160 | } | |
161 | ||
162 | int avfilter_default_query_formats(AVFilterContext *ctx) | |
163 | { | |
164 | avfilter_set_common_formats(ctx, avfilter_all_colorspaces()); | |
165 | return 0; | |
bf4ce7a3 VS |
166 | } |
167 | ||
91d1c741 BB |
168 | void avfilter_null_start_frame(AVFilterLink *link, AVFilterPicRef *picref) |
169 | { | |
170 | avfilter_start_frame(link->dst->outputs[0], picref); | |
171 | } | |
172 | ||
173 | void avfilter_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir) | |
174 | { | |
175 | avfilter_draw_slice(link->dst->outputs[0], y, h, slice_dir); | |
176 | } | |
177 | ||
178 | void avfilter_null_end_frame(AVFilterLink *link) | |
179 | { | |
180 | avfilter_end_frame(link->dst->outputs[0]); | |
181 | } | |
182 | ||
183 | AVFilterPicRef *avfilter_null_get_video_buffer(AVFilterLink *link, int perms, int w, int h) | |
184 | { | |
185 | return avfilter_get_video_buffer(link->dst->outputs[0], perms, w, h); | |
186 | } | |
187 |