Commit | Line | Data |
---|---|---|
a5cbb2f4 | 1 | /* |
664f6595 | 2 | * filter layer |
3fa77bde | 3 | * Copyright (c) 2007 Bobby Bingham |
a5cbb2f4 | 4 | * |
2912e87a | 5 | * This file is part of Libav. |
a5cbb2f4 | 6 | * |
2912e87a | 7 | * Libav is free software; you can redistribute it and/or |
a5cbb2f4 VS |
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 | * | |
2912e87a | 12 | * Libav is distributed in the hope that it will be useful, |
a5cbb2f4 VS |
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 | |
2912e87a | 18 | * License along with Libav; if not, write to the Free Software |
a5cbb2f4 VS |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | */ | |
21 | ||
98790382 SS |
22 | #ifndef AVFILTER_AVFILTER_H |
23 | #define AVFILTER_AVFILTER_H | |
a5cbb2f4 | 24 | |
1f20782c | 25 | #include "libavutil/avutil.h" |
abc78a5a | 26 | #include "libavutil/log.h" |
737eb597 | 27 | #include "libavutil/samplefmt.h" |
d49ea4af | 28 | #include "libavutil/pixfmt.h" |
e91709ca | 29 | #include "libavutil/rational.h" |
1c9e340d | 30 | #include "libavcodec/avcodec.h" |
1f20782c | 31 | |
a9c81431 | 32 | #include <stddef.h> |
a5cbb2f4 | 33 | |
3167dc95 AK |
34 | #include "libavfilter/version.h" |
35 | ||
540f1c7b | 36 | /** |
49bd8e4b | 37 | * Return the LIBAVFILTER_VERSION_INT constant. |
540f1c7b SS |
38 | */ |
39 | unsigned avfilter_version(void); | |
40 | ||
c1736936 | 41 | /** |
49bd8e4b | 42 | * Return the libavfilter build-time configuration. |
c1736936 | 43 | */ |
41600690 | 44 | const char *avfilter_configuration(void); |
c1736936 DB |
45 | |
46 | /** | |
49bd8e4b | 47 | * Return the libavfilter license. |
c1736936 | 48 | */ |
41600690 | 49 | const char *avfilter_license(void); |
c1736936 DB |
50 | |
51 | ||
a5cbb2f4 VS |
52 | typedef struct AVFilterContext AVFilterContext; |
53 | typedef struct AVFilterLink AVFilterLink; | |
54 | typedef struct AVFilterPad AVFilterPad; | |
55 | ||
a5cbb2f4 | 56 | /** |
32d7bcd4 | 57 | * A reference-counted buffer data type used by the filter system. Filters |
a5cbb2f4 | 58 | * should not store pointers to this structure directly, but instead use the |
ecc8dada | 59 | * AVFilterBufferRef structure below. |
a5cbb2f4 | 60 | */ |
f607cc18 | 61 | typedef struct AVFilterBuffer { |
56b5e9d5 HM |
62 | uint8_t *data[8]; ///< buffer data for each plane/channel |
63 | int linesize[8]; ///< number of bytes per line | |
a5cbb2f4 | 64 | |
32d7bcd4 | 65 | unsigned refcount; ///< number of references to this buffer |
13ff8fd0 VS |
66 | |
67 | /** private data to be used by a custom free function */ | |
a5cbb2f4 | 68 | void *priv; |
13ff8fd0 | 69 | /** |
32d7bcd4 | 70 | * A pointer to the function to deallocate this buffer if the default |
38efe768 | 71 | * function is not sufficient. This could, for example, add the memory |
13ff8fd0 VS |
72 | * back into a memory pool to be reused later without the overhead of |
73 | * reallocating it from scratch. | |
74 | */ | |
32d7bcd4 | 75 | void (*free)(struct AVFilterBuffer *buf); |
36dc00de MN |
76 | |
77 | int format; ///< media format | |
78 | int w, h; ///< width and height of the allocated buffer | |
9453c9e1 AK |
79 | |
80 | /** | |
81 | * pointers to the data planes/channels. | |
82 | * | |
83 | * For video, this should simply point to data[]. | |
84 | * | |
85 | * For planar audio, each channel has a separate data pointer, and | |
86 | * linesize[0] contains the size of each channel buffer. | |
87 | * For packed audio, there is just one data pointer, and linesize[0] | |
88 | * contains the total size of the buffer for all channels. | |
89 | * | |
90 | * Note: Both data and extended_data will always be set, but for planar | |
91 | * audio with more channels that can fit in data, extended_data must be used | |
92 | * in order to access all channels. | |
93 | */ | |
94 | uint8_t **extended_data; | |
f0d77b20 | 95 | } AVFilterBuffer; |
a5cbb2f4 | 96 | |
ff5f1be0 HM |
97 | #define AV_PERM_READ 0x01 ///< can read from the buffer |
98 | #define AV_PERM_WRITE 0x02 ///< can write to the buffer | |
99 | #define AV_PERM_PRESERVE 0x04 ///< nobody else can overwrite the buffer | |
100 | #define AV_PERM_REUSE 0x08 ///< can output the buffer multiple times, with the same contents each time | |
101 | #define AV_PERM_REUSE2 0x10 ///< can output the buffer multiple times, modified each time | |
0ccabeea | 102 | #define AV_PERM_NEG_LINESIZES 0x20 ///< the buffer requested can have negative linesizes |
ff5f1be0 | 103 | |
a5cbb2f4 | 104 | /** |
ad2c9501 HM |
105 | * Audio specific properties in a reference to an AVFilterBuffer. Since |
106 | * AVFilterBufferRef is common to different media formats, audio specific | |
107 | * per reference properties must be separated out. | |
108 | */ | |
109 | typedef struct AVFilterBufferRefAudioProps { | |
cc276c85 | 110 | uint64_t channel_layout; ///< channel layout of audio buffer |
a242ac36 | 111 | int nb_samples; ///< number of audio samples |
a6bdfc2a | 112 | int sample_rate; ///< audio buffer sample rate |
ad2c9501 HM |
113 | int planar; ///< audio buffer - planar or packed |
114 | } AVFilterBufferRefAudioProps; | |
115 | ||
116 | /** | |
cc80caff HM |
117 | * Video specific properties in a reference to an AVFilterBuffer. Since |
118 | * AVFilterBufferRef is common to different media formats, video specific | |
119 | * per reference properties must be separated out. | |
120 | */ | |
f607cc18 | 121 | typedef struct AVFilterBufferRefVideoProps { |
cc80caff HM |
122 | int w; ///< image width |
123 | int h; ///< image height | |
124 | AVRational pixel_aspect; ///< pixel aspect ratio | |
125 | int interlaced; ///< is frame interlaced | |
126 | int top_field_first; ///< field order | |
bebe72f4 | 127 | enum AVPictureType pict_type; ///< picture type of the frame |
10d39405 | 128 | int key_frame; ///< 1 -> keyframe, 0-> not |
cc80caff HM |
129 | } AVFilterBufferRefVideoProps; |
130 | ||
131 | /** | |
f0d77b20 | 132 | * A reference to an AVFilterBuffer. Since filters can manipulate the origin of |
7fce481a | 133 | * a buffer to, for example, crop image without any memcpy, the buffer origin |
38efe768 | 134 | * and dimensions are per-reference properties. Linesize is also useful for |
bbf42679 | 135 | * image flipping, frame to field filters, etc, and so is also per-reference. |
a5cbb2f4 | 136 | * |
1a18860a | 137 | * TODO: add anything necessary for frame reordering |
a5cbb2f4 | 138 | */ |
f607cc18 | 139 | typedef struct AVFilterBufferRef { |
7fce481a | 140 | AVFilterBuffer *buf; ///< the buffer that this is a reference to |
ad2c9501 | 141 | uint8_t *data[8]; ///< picture/audio data for each plane |
c1db7bff | 142 | int linesize[8]; ///< number of bytes per line |
d54e0948 | 143 | int format; ///< media format |
a5cbb2f4 | 144 | |
867ae7aa SS |
145 | /** |
146 | * presentation timestamp. The time unit may change during | |
147 | * filtering, as it is specified in the link and the filter code | |
148 | * may need to rescale the PTS accordingly. | |
149 | */ | |
150 | int64_t pts; | |
5bb5c1dc | 151 | int64_t pos; ///< byte position in stream, -1 if unknown |
1a18860a | 152 | |
ff5f1be0 | 153 | int perms; ///< permissions, see the AV_PERM_* flags |
efdc74ef | 154 | |
cc80caff HM |
155 | enum AVMediaType type; ///< media type of buffer data |
156 | AVFilterBufferRefVideoProps *video; ///< video buffer specific properties | |
ad2c9501 | 157 | AVFilterBufferRefAudioProps *audio; ///< audio buffer specific properties |
9453c9e1 AK |
158 | |
159 | /** | |
160 | * pointers to the data planes/channels. | |
161 | * | |
162 | * For video, this should simply point to data[]. | |
163 | * | |
164 | * For planar audio, each channel has a separate data pointer, and | |
165 | * linesize[0] contains the size of each channel buffer. | |
166 | * For packed audio, there is just one data pointer, and linesize[0] | |
167 | * contains the total size of the buffer for all channels. | |
168 | * | |
169 | * Note: Both data and extended_data will always be set, but for planar | |
170 | * audio with more channels that can fit in data, extended_data must be used | |
171 | * in order to access all channels. | |
172 | */ | |
173 | uint8_t **extended_data; | |
ecc8dada | 174 | } AVFilterBufferRef; |
a5cbb2f4 VS |
175 | |
176 | /** | |
ad2c9501 | 177 | * Copy properties of src to dst, without copying the actual data |
4d508e4d | 178 | */ |
8134fafe | 179 | void avfilter_copy_buffer_ref_props(AVFilterBufferRef *dst, AVFilterBufferRef *src); |
4d508e4d SS |
180 | |
181 | /** | |
7fce481a | 182 | * Add a new reference to a buffer. |
3fa3e4f4 | 183 | * |
7fce481a | 184 | * @param ref an existing reference to the buffer |
664f6595 | 185 | * @param pmask a bitmask containing the allowable permissions in the new |
13ff8fd0 | 186 | * reference |
7fce481a | 187 | * @return a new reference to the buffer with the same properties as the |
13ff8fd0 | 188 | * old, excluding any permissions denied by pmask |
a5cbb2f4 | 189 | */ |
7fce481a | 190 | AVFilterBufferRef *avfilter_ref_buffer(AVFilterBufferRef *ref, int pmask); |
a5cbb2f4 VS |
191 | |
192 | /** | |
7fce481a HM |
193 | * Remove a reference to a buffer. If this is the last reference to the |
194 | * buffer, the buffer itself is also automatically freed. | |
3fa3e4f4 | 195 | * |
6baf4afa | 196 | * @param ref reference to the buffer, may be NULL |
a5cbb2f4 | 197 | */ |
7fce481a | 198 | void avfilter_unref_buffer(AVFilterBufferRef *ref); |
a5cbb2f4 | 199 | |
13ff8fd0 | 200 | /** |
35f3fdf4 VS |
201 | * A list of supported formats for one end of a filter link. This is used |
202 | * during the format negotiation process to try to pick the best format to | |
203 | * use to minimize the number of necessary conversions. Each filter gives a | |
204 | * list of the formats supported by each input and output pad. The list | |
205 | * given for each pad need not be distinct - they may be references to the | |
206 | * same list of formats, as is often the case when a filter supports multiple | |
42f72a3a | 207 | * formats, but will always output the same format as it is given in input. |
35f3fdf4 VS |
208 | * |
209 | * In this way, a list of possible input formats and a list of possible | |
210 | * output formats are associated with each link. When a set of formats is | |
211 | * negotiated over a link, the input and output lists are merged to form a | |
212 | * new list containing only the common elements of each list. In the case | |
213 | * that there were no common elements, a format conversion is necessary. | |
214 | * Otherwise, the lists are merged, and all other links which reference | |
215 | * either of the format lists involved in the merge are also affected. | |
216 | * | |
217 | * For example, consider the filter chain: | |
218 | * filter (a) --> (b) filter (b) --> (c) filter | |
219 | * | |
220 | * where the letters in parenthesis indicate a list of formats supported on | |
221 | * the input or output of the link. Suppose the lists are as follows: | |
222 | * (a) = {A, B} | |
223 | * (b) = {A, B, C} | |
224 | * (c) = {B, C} | |
225 | * | |
226 | * First, the first link's lists are merged, yielding: | |
227 | * filter (a) --> (a) filter (a) --> (c) filter | |
228 | * | |
229 | * Notice that format list (b) now refers to the same list as filter list (a). | |
230 | * Next, the lists for the second link are merged, yielding: | |
231 | * filter (a) --> (a) filter (a) --> (a) filter | |
232 | * | |
233 | * where (a) = {B}. | |
234 | * | |
235 | * Unfortunately, when the format lists at the two ends of a link are merged, | |
236 | * we must ensure that all links which reference either pre-merge format list | |
237 | * get updated as well. Therefore, we have the format list structure store a | |
238 | * pointer to each of the pointers to itself. | |
239 | */ | |
f607cc18 | 240 | typedef struct AVFilterFormats { |
35f3fdf4 | 241 | unsigned format_count; ///< number of formats |
bdab614b | 242 | int *formats; ///< list of media formats |
35f3fdf4 VS |
243 | |
244 | unsigned refcount; ///< number of references to this list | |
f607cc18 | 245 | struct AVFilterFormats ***refs; ///< references to this list |
daed21a1 | 246 | } AVFilterFormats; |
35f3fdf4 VS |
247 | |
248 | /** | |
49bd8e4b | 249 | * Create a list of supported formats. This is intended for use in |
f6a1fa85 | 250 | * AVFilter->query_formats(). |
3fa3e4f4 | 251 | * |
bdab614b | 252 | * @param fmts list of media formats, terminated by -1 |
f6a1fa85 SS |
253 | * @return the format list, with no existing references |
254 | */ | |
bdab614b | 255 | AVFilterFormats *avfilter_make_format_list(const int *fmts); |
f6a1fa85 SS |
256 | |
257 | /** | |
bdab614b | 258 | * Add fmt to the list of media formats contained in *avff. |
c1d662fd SS |
259 | * If *avff is NULL the function allocates the filter formats struct |
260 | * and puts its pointer in *avff. | |
4fd1f187 SS |
261 | * |
262 | * @return a non negative value in case of success, or a negative | |
263 | * value corresponding to an AVERROR code in case of error | |
264 | */ | |
bdab614b | 265 | int avfilter_add_format(AVFilterFormats **avff, int fmt); |
4fd1f187 SS |
266 | |
267 | /** | |
2912e87a | 268 | * Return a list of all formats supported by Libav for the given media type. |
35f3fdf4 | 269 | */ |
bdab614b | 270 | AVFilterFormats *avfilter_all_formats(enum AVMediaType type); |
35f3fdf4 VS |
271 | |
272 | /** | |
49bd8e4b | 273 | * Return a format list which contains the intersection of the formats of |
39981f53 SS |
274 | * a and b. Also, all the references of a, all the references of b, and |
275 | * a and b themselves will be deallocated. | |
35f3fdf4 VS |
276 | * |
277 | * If a and b do not share any common formats, neither is modified, and NULL | |
278 | * is returned. | |
279 | */ | |
280 | AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b); | |
281 | ||
09b63a42 | 282 | /** |
49bd8e4b | 283 | * Add *ref as a new reference to formats. |
09b63a42 MN |
284 | * That is the pointers will point like in the ascii art below: |
285 | * ________ | |
a27c8d5f MN |
286 | * |formats |<--------. |
287 | * | ____ | ____|___________________ | |
288 | * | |refs| | | __|_ | |
289 | * | |* * | | | | | | AVFilterLink | |
09b63a42 | 290 | * | |* *--------->|*ref| |
a27c8d5f MN |
291 | * | |____| | | |____| |
292 | * |________| |________________________ | |
09b63a42 | 293 | */ |
a27c8d5f | 294 | void avfilter_formats_ref(AVFilterFormats *formats, AVFilterFormats **ref); |
35f3fdf4 VS |
295 | |
296 | /** | |
49bd8e4b | 297 | * If *ref is non-NULL, remove *ref as a reference to the format list |
063e7692 SS |
298 | * it currently points to, deallocates that list if this was the last |
299 | * reference, and sets *ref to NULL. | |
a27c8d5f MN |
300 | * |
301 | * Before After | |
302 | * ________ ________ NULL | |
303 | * |formats |<--------. |formats | ^ | |
304 | * | ____ | ____|________________ | ____ | ____|________________ | |
305 | * | |refs| | | __|_ | |refs| | | __|_ | |
306 | * | |* * | | | | | | AVFilterLink | |* * | | | | | | AVFilterLink | |
307 | * | |* *--------->|*ref| | |* | | | |*ref| | |
308 | * | |____| | | |____| | |____| | | |____| | |
309 | * |________| |_____________________ |________| |_____________________ | |
35f3fdf4 VS |
310 | */ |
311 | void avfilter_formats_unref(AVFilterFormats **ref); | |
312 | ||
b9c2fb34 MN |
313 | /** |
314 | * | |
315 | * Before After | |
316 | * ________ ________ | |
a27c8d5f | 317 | * |formats |<---------. |formats |<---------. |
b9c2fb34 MN |
318 | * | ____ | ___|___ | ____ | ___|___ |
319 | * | |refs| | | | | | |refs| | | | | NULL | |
320 | * | |* *--------->|*oldref| | |* *--------->|*newref| ^ | |
321 | * | |* * | | |_______| | |* * | | |_______| ___|___ | |
322 | * | |____| | | |____| | | | | | |
323 | * |________| |________| |*oldref| | |
324 | * |_______| | |
325 | */ | |
eb30e86c MN |
326 | void avfilter_formats_changeref(AVFilterFormats **oldref, |
327 | AVFilterFormats **newref); | |
328 | ||
35f3fdf4 | 329 | /** |
664f6595 | 330 | * A filter pad used for either input or output. |
13ff8fd0 | 331 | */ |
f607cc18 | 332 | struct AVFilterPad { |
a5cbb2f4 | 333 | /** |
38efe768 SS |
334 | * Pad name. The name is unique among inputs and among outputs, but an |
335 | * input may have the same name as an output. This may be NULL if this | |
13ff8fd0 | 336 | * pad has no need to ever be referenced by name. |
a5cbb2f4 | 337 | */ |
2844dd39 | 338 | const char *name; |
a5cbb2f4 VS |
339 | |
340 | /** | |
0ce4a627 | 341 | * AVFilterPad type. |
a5cbb2f4 | 342 | */ |
72415b2a | 343 | enum AVMediaType type; |
a5cbb2f4 VS |
344 | |
345 | /** | |
38efe768 | 346 | * Minimum required permissions on incoming buffers. Any buffer with |
60bf6ce3 VS |
347 | * insufficient permissions will be automatically copied by the filter |
348 | * system to a new buffer which provides the needed access permissions. | |
349 | * | |
350 | * Input pads only. | |
351 | */ | |
352 | int min_perms; | |
353 | ||
354 | /** | |
38efe768 | 355 | * Permissions which are not accepted on incoming buffers. Any buffer |
9ce95f27 SS |
356 | * which has any of these permissions set will be automatically copied |
357 | * by the filter system to a new buffer which does not have those | |
38efe768 | 358 | * permissions. This can be used to easily disallow buffers with |
9ce95f27 | 359 | * AV_PERM_REUSE. |
60bf6ce3 VS |
360 | * |
361 | * Input pads only. | |
362 | */ | |
363 | int rej_perms; | |
364 | ||
365 | /** | |
38efe768 | 366 | * Callback called before passing the first slice of a new frame. If |
a5cbb2f4 VS |
367 | * NULL, the filter layer will default to storing a reference to the |
368 | * picture inside the link structure. | |
13ff8fd0 VS |
369 | * |
370 | * Input video pads only. | |
a5cbb2f4 | 371 | */ |
ecc8dada | 372 | void (*start_frame)(AVFilterLink *link, AVFilterBufferRef *picref); |
a5cbb2f4 VS |
373 | |
374 | /** | |
ad2c9501 | 375 | * Callback function to get a video buffer. If NULL, the filter system will |
da23d424 | 376 | * use avfilter_default_get_video_buffer(). |
13ff8fd0 VS |
377 | * |
378 | * Input video pads only. | |
a5cbb2f4 | 379 | */ |
ecc8dada | 380 | AVFilterBufferRef *(*get_video_buffer)(AVFilterLink *link, int perms, int w, int h); |
a5cbb2f4 VS |
381 | |
382 | /** | |
ad2c9501 HM |
383 | * Callback function to get an audio buffer. If NULL, the filter system will |
384 | * use avfilter_default_get_audio_buffer(). | |
385 | * | |
386 | * Input audio pads only. | |
387 | */ | |
388 | AVFilterBufferRef *(*get_audio_buffer)(AVFilterLink *link, int perms, | |
7ef0adcc | 389 | int nb_samples); |
ad2c9501 HM |
390 | |
391 | /** | |
38efe768 | 392 | * Callback called after the slices of a frame are completely sent. If |
a5cbb2f4 VS |
393 | * NULL, the filter layer will default to releasing the reference stored |
394 | * in the link structure during start_frame(). | |
13ff8fd0 VS |
395 | * |
396 | * Input video pads only. | |
a5cbb2f4 VS |
397 | */ |
398 | void (*end_frame)(AVFilterLink *link); | |
399 | ||
400 | /** | |
38efe768 | 401 | * Slice drawing callback. This is where a filter receives video data |
13ff8fd0 VS |
402 | * and should do its processing. |
403 | * | |
404 | * Input video pads only. | |
a5cbb2f4 | 405 | */ |
a13a5437 | 406 | void (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir); |
a5cbb2f4 VS |
407 | |
408 | /** | |
ad2c9501 HM |
409 | * Samples filtering callback. This is where a filter receives audio data |
410 | * and should do its processing. | |
411 | * | |
412 | * Input audio pads only. | |
413 | */ | |
414 | void (*filter_samples)(AVFilterLink *link, AVFilterBufferRef *samplesref); | |
415 | ||
416 | /** | |
38efe768 | 417 | * Frame poll callback. This returns the number of immediately available |
177477f5 | 418 | * samples. It should return a positive value if the next request_frame() |
d224d73a VS |
419 | * is guaranteed to return one frame (with no delay). |
420 | * | |
421 | * Defaults to just calling the source poll_frame() method. | |
422 | * | |
ce353a88 | 423 | * Output pads only. |
d224d73a VS |
424 | */ |
425 | int (*poll_frame)(AVFilterLink *link); | |
426 | ||
427 | /** | |
38efe768 SS |
428 | * Frame request callback. A call to this should result in at least one |
429 | * frame being output over the given link. This should return zero on | |
13ff8fd0 VS |
430 | * success, and another value on error. |
431 | * | |
ce353a88 | 432 | * Output pads only. |
a5cbb2f4 | 433 | */ |
63f64e6f | 434 | int (*request_frame)(AVFilterLink *link); |
a5cbb2f4 VS |
435 | |
436 | /** | |
13ff8fd0 VS |
437 | * Link configuration callback. |
438 | * | |
439 | * For output pads, this should set the link properties such as | |
38efe768 | 440 | * width/height. This should NOT set the format property - that is |
13ff8fd0 VS |
441 | * negotiated between filters by the filter system using the |
442 | * query_formats() callback before this function is called. | |
d3e57c15 VS |
443 | * |
444 | * For input pads, this should check the properties of the link, and update | |
445 | * the filter's internal state as necessary. | |
13ff8fd0 VS |
446 | * |
447 | * For both input and output filters, this should return zero on success, | |
448 | * and another value on error. | |
a5cbb2f4 | 449 | */ |
d3e57c15 | 450 | int (*config_props)(AVFilterLink *link); |
a5cbb2f4 VS |
451 | }; |
452 | ||
43c7a01e | 453 | #if FF_API_FILTERS_PUBLIC |
2b187df9 | 454 | /** default handler for start_frame() for video inputs */ |
43c7a01e | 455 | attribute_deprecated |
ecc8dada | 456 | void avfilter_default_start_frame(AVFilterLink *link, AVFilterBufferRef *picref); |
a4fb0ada | 457 | |
b9609848 | 458 | /** default handler for draw_slice() for video inputs */ |
43c7a01e | 459 | attribute_deprecated |
a13a5437 | 460 | void avfilter_default_draw_slice(AVFilterLink *link, int y, int h, int slice_dir); |
a4fb0ada | 461 | |
2b187df9 | 462 | /** default handler for end_frame() for video inputs */ |
43c7a01e | 463 | attribute_deprecated |
a5cbb2f4 | 464 | void avfilter_default_end_frame(AVFilterLink *link); |
a4fb0ada | 465 | |
88c3b87b | 466 | #if FF_API_DEFAULT_CONFIG_OUTPUT_LINK |
ad2c9501 | 467 | /** default handler for config_props() for audio/video outputs */ |
88c3b87b | 468 | attribute_deprecated |
901e6b39 | 469 | int avfilter_default_config_output_link(AVFilterLink *link); |
88c3b87b | 470 | #endif |
a4fb0ada | 471 | |
2b187df9 | 472 | /** default handler for get_video_buffer() for video inputs */ |
43c7a01e | 473 | attribute_deprecated |
ecc8dada | 474 | AVFilterBufferRef *avfilter_default_get_video_buffer(AVFilterLink *link, |
a4fb0ada | 475 | int perms, int w, int h); |
ad2c9501 | 476 | |
43c7a01e AK |
477 | /** Default handler for query_formats() */ |
478 | attribute_deprecated | |
479 | int avfilter_default_query_formats(AVFilterContext *ctx); | |
480 | #endif | |
481 | ||
35f3fdf4 VS |
482 | /** |
483 | * A helper for query_formats() which sets all links to the same list of | |
484 | * formats. If there are no links hooked to this filter, the list of formats is | |
485 | * freed. | |
486 | */ | |
487 | void avfilter_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats); | |
a4fb0ada | 488 | |
c04c533f | 489 | #if FF_API_FILTERS_PUBLIC |
91d1c741 | 490 | /** start_frame() handler for filters which simply pass video along */ |
c04c533f | 491 | attribute_deprecated |
ecc8dada | 492 | void avfilter_null_start_frame(AVFilterLink *link, AVFilterBufferRef *picref); |
91d1c741 BB |
493 | |
494 | /** draw_slice() handler for filters which simply pass video along */ | |
c04c533f | 495 | attribute_deprecated |
91d1c741 BB |
496 | void avfilter_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir); |
497 | ||
498 | /** end_frame() handler for filters which simply pass video along */ | |
c04c533f | 499 | attribute_deprecated |
91d1c741 BB |
500 | void avfilter_null_end_frame(AVFilterLink *link); |
501 | ||
502 | /** get_video_buffer() handler for filters which simply pass video along */ | |
c04c533f | 503 | attribute_deprecated |
ecc8dada | 504 | AVFilterBufferRef *avfilter_null_get_video_buffer(AVFilterLink *link, |
91d1c741 | 505 | int perms, int w, int h); |
c04c533f | 506 | #endif |
91d1c741 | 507 | |
13ff8fd0 | 508 | /** |
38efe768 | 509 | * Filter definition. This defines the pads a filter contains, and all the |
13ff8fd0 VS |
510 | * callback functions used to interact with the filter. |
511 | */ | |
f607cc18 | 512 | typedef struct AVFilter { |
2844dd39 | 513 | const char *name; ///< filter name |
a5cbb2f4 | 514 | |
13ff8fd0 | 515 | int priv_size; ///< size of private data to allocate for the filter |
a5cbb2f4 | 516 | |
4d96a914 | 517 | /** |
38efe768 SS |
518 | * Filter initialization function. Args contains the user-supplied |
519 | * parameters. FIXME: maybe an AVOption-based system would be better? | |
6e365c57 VS |
520 | * opaque is data provided by the code requesting creation of the filter, |
521 | * and is used to pass data to the filter. | |
4d96a914 | 522 | */ |
95bcf498 | 523 | int (*init)(AVFilterContext *ctx, const char *args, void *opaque); |
13ff8fd0 VS |
524 | |
525 | /** | |
38efe768 | 526 | * Filter uninitialization function. Should deallocate any memory held |
7fce481a | 527 | * by the filter, release any buffer references, etc. This does not need |
13ff8fd0 VS |
528 | * to deallocate the AVFilterContext->priv memory itself. |
529 | */ | |
a5cbb2f4 VS |
530 | void (*uninit)(AVFilterContext *ctx); |
531 | ||
35f3fdf4 | 532 | /** |
c4d2e41c | 533 | * Queries formats supported by the filter and its pads, and sets the |
35f3fdf4 VS |
534 | * in_formats for links connected to its output pads, and out_formats |
535 | * for links connected to its input pads. | |
536 | * | |
fe592585 SS |
537 | * @return zero on success, a negative value corresponding to an |
538 | * AVERROR code otherwise | |
35f3fdf4 VS |
539 | */ |
540 | int (*query_formats)(AVFilterContext *); | |
541 | ||
13ff8fd0 VS |
542 | const AVFilterPad *inputs; ///< NULL terminated list of inputs. NULL if none |
543 | const AVFilterPad *outputs; ///< NULL terminated list of outputs. NULL if none | |
cccd292a SS |
544 | |
545 | /** | |
546 | * A description for the filter. You should use the | |
547 | * NULL_IF_CONFIG_SMALL() macro to define it. | |
548 | */ | |
549 | const char *description; | |
a5cbb2f4 VS |
550 | } AVFilter; |
551 | ||
13ff8fd0 | 552 | /** An instance of a filter */ |
f607cc18 | 553 | struct AVFilterContext { |
d42a814e | 554 | const AVClass *av_class; ///< needed for av_log() |
a5cbb2f4 | 555 | |
664f6595 | 556 | AVFilter *filter; ///< the AVFilter of which this is an instance |
a5cbb2f4 | 557 | |
13ff8fd0 | 558 | char *name; ///< name of this filter instance |
dcea2482 | 559 | |
13ff8fd0 VS |
560 | unsigned input_count; ///< number of input pads |
561 | AVFilterPad *input_pads; ///< array of input pads | |
562 | AVFilterLink **inputs; ///< array of pointers to input links | |
25f8e601 | 563 | |
13ff8fd0 VS |
564 | unsigned output_count; ///< number of output pads |
565 | AVFilterPad *output_pads; ///< array of output pads | |
566 | AVFilterLink **outputs; ///< array of pointers to output links | |
a5cbb2f4 | 567 | |
13ff8fd0 | 568 | void *priv; ///< private data for use by the filter |
a5cbb2f4 VS |
569 | }; |
570 | ||
13ff8fd0 | 571 | /** |
38efe768 | 572 | * A link between two filters. This contains pointers to the source and |
f4433de9 | 573 | * destination filters between which this link exists, and the indexes of |
38efe768 | 574 | * the pads involved. In addition, this link also contains the parameters |
13ff8fd0 | 575 | * which have been negotiated and agreed upon between the filter, such as |
2b187df9 | 576 | * image dimensions, format, etc. |
13ff8fd0 | 577 | */ |
f607cc18 | 578 | struct AVFilterLink { |
13ff8fd0 | 579 | AVFilterContext *src; ///< source filter |
acc0490f | 580 | AVFilterPad *srcpad; ///< output pad on the source filter |
a5cbb2f4 | 581 | |
13ff8fd0 | 582 | AVFilterContext *dst; ///< dest filter |
acc0490f | 583 | AVFilterPad *dstpad; ///< input pad on the dest filter |
a5cbb2f4 | 584 | |
24c4eff6 VS |
585 | /** stage of the initialization of the link properties (dimensions, etc) */ |
586 | enum { | |
587 | AVLINK_UNINIT = 0, ///< not started | |
588 | AVLINK_STARTINIT, ///< started, but incomplete | |
589 | AVLINK_INIT ///< complete | |
590 | } init_state; | |
591 | ||
bdab614b HM |
592 | enum AVMediaType type; ///< filter media type |
593 | ||
910b5b82 | 594 | /* These parameters apply only to video */ |
13ff8fd0 VS |
595 | int w; ///< agreed upon image width |
596 | int h; ///< agreed upon image height | |
910b5b82 | 597 | AVRational sample_aspect_ratio; ///< agreed upon sample aspect ratio |
ad2c9501 | 598 | /* These two parameters apply only to audio */ |
cc276c85 | 599 | uint64_t channel_layout; ///< channel layout of current buffer (see libavutil/audioconvert.h) |
f20ab492 | 600 | #if FF_API_SAMPLERATE64 |
ad2c9501 | 601 | int64_t sample_rate; ///< samples per second |
f20ab492 AK |
602 | #else |
603 | int sample_rate; ///< samples per second | |
604 | #endif | |
ad2c9501 | 605 | |
bdab614b | 606 | int format; ///< agreed upon media format |
a5cbb2f4 | 607 | |
60bf6ce3 | 608 | /** |
35f3fdf4 VS |
609 | * Lists of formats supported by the input and output filters respectively. |
610 | * These lists are used for negotiating the format to actually be used, | |
611 | * which will be loaded into the format member, above, when chosen. | |
612 | */ | |
613 | AVFilterFormats *in_formats; | |
614 | AVFilterFormats *out_formats; | |
615 | ||
616 | /** | |
7fce481a | 617 | * The buffer reference currently being sent across the link by the source |
38efe768 | 618 | * filter. This is used internally by the filter system to allow |
7fce481a | 619 | * automatic copying of buffers which do not have sufficient permissions |
38efe768 | 620 | * for the destination. This should not be accessed directly by the |
60bf6ce3 VS |
621 | * filters. |
622 | */ | |
5d4890d7 | 623 | AVFilterBufferRef *src_buf; |
60bf6ce3 | 624 | |
5d4890d7 HM |
625 | AVFilterBufferRef *cur_buf; |
626 | AVFilterBufferRef *out_buf; | |
867ae7aa SS |
627 | |
628 | /** | |
629 | * Define the time base used by the PTS of the frames/samples | |
630 | * which will pass through this link. | |
631 | * During the configuration stage, each filter is supposed to | |
632 | * change only the output timebase, while the timebase of the | |
633 | * input link is assumed to be an unchangeable property. | |
634 | */ | |
635 | AVRational time_base; | |
5775a183 AK |
636 | |
637 | /***************************************************************** | |
638 | * All fields below this line are not part of the public API. They | |
639 | * may not be used outside of libavfilter and can be changed and | |
640 | * removed at will. | |
641 | * New public fields should be added right above. | |
642 | ***************************************************************** | |
643 | */ | |
644 | /** | |
645 | * Lists of channel layouts and sample rates used for automatic | |
646 | * negotiation. | |
647 | */ | |
648 | AVFilterFormats *in_samplerates; | |
649 | AVFilterFormats *out_samplerates; | |
650 | struct AVFilterChannelLayouts *in_channel_layouts; | |
651 | struct AVFilterChannelLayouts *out_channel_layouts; | |
a5cbb2f4 VS |
652 | }; |
653 | ||
13ff8fd0 | 654 | /** |
49bd8e4b | 655 | * Link two filters together. |
3fa3e4f4 | 656 | * |
664f6595 VS |
657 | * @param src the source filter |
658 | * @param srcpad index of the output pad on the source filter | |
659 | * @param dst the destination filter | |
660 | * @param dstpad index of the input pad on the destination filter | |
661 | * @return zero on success | |
13ff8fd0 | 662 | */ |
a5cbb2f4 VS |
663 | int avfilter_link(AVFilterContext *src, unsigned srcpad, |
664 | AVFilterContext *dst, unsigned dstpad); | |
665 | ||
13ff8fd0 | 666 | /** |
bdab614b | 667 | * Negotiate the media format, dimensions, etc of all inputs to a filter. |
3fa3e4f4 | 668 | * |
664f6595 VS |
669 | * @param filter the filter to negotiate the properties for its inputs |
670 | * @return zero on successful negotiation | |
13ff8fd0 | 671 | */ |
24c4eff6 | 672 | int avfilter_config_links(AVFilterContext *filter); |
85322466 | 673 | |
13ff8fd0 | 674 | /** |
49bd8e4b | 675 | * Request a picture buffer with a specific set of permissions. |
3fa3e4f4 | 676 | * |
7fce481a | 677 | * @param link the output link to the filter from which the buffer will |
13ff8fd0 | 678 | * be requested |
664f6595 | 679 | * @param perms the required access permissions |
0eb4ff9e SS |
680 | * @param w the minimum width of the buffer to allocate |
681 | * @param h the minimum height of the buffer to allocate | |
7fce481a HM |
682 | * @return A reference to the buffer. This must be unreferenced with |
683 | * avfilter_unref_buffer when you are finished with it. | |
13ff8fd0 | 684 | */ |
ecc8dada | 685 | AVFilterBufferRef *avfilter_get_video_buffer(AVFilterLink *link, int perms, |
0eb4ff9e | 686 | int w, int h); |
13ff8fd0 VS |
687 | |
688 | /** | |
d38c340f SS |
689 | * Create a buffer reference wrapped around an already allocated image |
690 | * buffer. | |
691 | * | |
692 | * @param data pointers to the planes of the image to reference | |
693 | * @param linesize linesizes for the planes of the image to reference | |
694 | * @param perms the required access permissions | |
695 | * @param w the width of the image specified by the data and linesize arrays | |
696 | * @param h the height of the image specified by the data and linesize arrays | |
697 | * @param format the pixel format of the image specified by the data and linesize arrays | |
698 | */ | |
699 | AVFilterBufferRef * | |
700 | avfilter_get_video_buffer_ref_from_arrays(uint8_t *data[4], int linesize[4], int perms, | |
701 | int w, int h, enum PixelFormat format); | |
702 | ||
703 | /** | |
1b8c9271 SS |
704 | * Create an audio buffer reference wrapped around an already |
705 | * allocated samples buffer. | |
706 | * | |
707 | * @param data pointers to the samples plane buffers | |
708 | * @param linesize linesize for the samples plane buffers | |
709 | * @param perms the required access permissions | |
710 | * @param nb_samples number of samples per channel | |
711 | * @param sample_fmt the format of each sample in the buffer to allocate | |
712 | * @param channel_layout the channel layout of the buffer | |
713 | */ | |
714 | AVFilterBufferRef *avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data, | |
715 | int linesize, | |
716 | int perms, | |
717 | int nb_samples, | |
718 | enum AVSampleFormat sample_fmt, | |
719 | uint64_t channel_layout); | |
720 | ||
721 | /** | |
49bd8e4b | 722 | * Request an input frame from the filter at the other end of the link. |
3fa3e4f4 | 723 | * |
664f6595 VS |
724 | * @param link the input link |
725 | * @return zero on success | |
13ff8fd0 | 726 | */ |
0155b1a1 | 727 | int avfilter_request_frame(AVFilterLink *link); |
13ff8fd0 VS |
728 | |
729 | /** | |
49bd8e4b | 730 | * Poll a frame from the filter chain. |
3fa3e4f4 | 731 | * |
b04c740a | 732 | * @param link the input link |
055068d0 SS |
733 | * @return the number of immediately available frames, a negative |
734 | * number in case of error | |
b04c740a VS |
735 | */ |
736 | int avfilter_poll_frame(AVFilterLink *link); | |
737 | ||
738 | /** | |
58c42af7 | 739 | * Notify the next filter of the start of a frame. |
3fa3e4f4 | 740 | * |
664f6595 | 741 | * @param link the output link the frame will be sent over |
38efe768 | 742 | * @param picref A reference to the frame about to be sent. The data for this |
13ff8fd0 | 743 | * frame need only be valid once draw_slice() is called for that |
38efe768 | 744 | * portion. The receiving filter will free this reference when |
13ff8fd0 VS |
745 | * it no longer needs it. |
746 | */ | |
ecc8dada | 747 | void avfilter_start_frame(AVFilterLink *link, AVFilterBufferRef *picref); |
13ff8fd0 VS |
748 | |
749 | /** | |
49bd8e4b | 750 | * Notifie the next filter that the current frame has finished. |
3fa3e4f4 | 751 | * |
664f6595 | 752 | * @param link the output link the frame was sent over |
13ff8fd0 | 753 | */ |
a5cbb2f4 | 754 | void avfilter_end_frame(AVFilterLink *link); |
13ff8fd0 VS |
755 | |
756 | /** | |
49bd8e4b | 757 | * Send a slice to the next filter. |
bd283738 SS |
758 | * |
759 | * Slices have to be provided in sequential order, either in | |
760 | * top-bottom or bottom-top order. If slices are provided in | |
761 | * non-sequential order the behavior of the function is undefined. | |
762 | * | |
664f6595 VS |
763 | * @param link the output link over which the frame is being sent |
764 | * @param y offset in pixels from the top of the image for this slice | |
765 | * @param h height of this slice in pixels | |
a13a5437 SS |
766 | * @param slice_dir the assumed direction for sending slices, |
767 | * from the top slice to the bottom slice if the value is 1, | |
768 | * from the bottom slice to the top slice if the value is -1, | |
769 | * for other values the behavior of the function is undefined. | |
13ff8fd0 | 770 | */ |
a13a5437 | 771 | void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir); |
a5cbb2f4 | 772 | |
49bd8e4b | 773 | /** Initialize the filter system. Register all builtin filters. */ |
11de6cac | 774 | void avfilter_register_all(void); |
e4152452 | 775 | |
49bd8e4b | 776 | /** Uninitialize the filter system. Unregister all filters. */ |
a5cbb2f4 | 777 | void avfilter_uninit(void); |
13ff8fd0 VS |
778 | |
779 | /** | |
49bd8e4b | 780 | * Register a filter. This is only needed if you plan to use |
fc815c56 VS |
781 | * avfilter_get_by_name later to lookup the AVFilter structure by name. A |
782 | * filter can still by instantiated with avfilter_open even if it is not | |
783 | * registered. | |
3fa3e4f4 | 784 | * |
664f6595 | 785 | * @param filter the filter to register |
86a60fa1 SS |
786 | * @return 0 if the registration was succesfull, a negative value |
787 | * otherwise | |
13ff8fd0 | 788 | */ |
86a60fa1 | 789 | int avfilter_register(AVFilter *filter); |
13ff8fd0 VS |
790 | |
791 | /** | |
49bd8e4b | 792 | * Get a filter definition matching the given name. |
3fa3e4f4 | 793 | * |
664f6595 VS |
794 | * @param name the filter name to find |
795 | * @return the filter definition, if any matching one is registered. | |
13ff8fd0 VS |
796 | * NULL if none found. |
797 | */ | |
2844dd39 | 798 | AVFilter *avfilter_get_by_name(const char *name); |
a5cbb2f4 | 799 | |
13ff8fd0 | 800 | /** |
1433c4ab SS |
801 | * If filter is NULL, returns a pointer to the first registered filter pointer, |
802 | * if filter is non-NULL, returns the next pointer after filter. | |
803 | * If the returned pointer points to NULL, the last registered filter | |
804 | * was already reached. | |
805 | */ | |
806 | AVFilter **av_filter_next(AVFilter **filter); | |
807 | ||
808 | /** | |
49bd8e4b | 809 | * Create a filter instance. |
84c03869 SS |
810 | * |
811 | * @param filter_ctx put here a pointer to the created filter context | |
812 | * on success, NULL on failure | |
664f6595 | 813 | * @param filter the filter to create an instance of |
38efe768 | 814 | * @param inst_name Name to give to the new instance. Can be NULL for none. |
84c03869 | 815 | * @return >= 0 in case of success, a negative error code otherwise |
13ff8fd0 | 816 | */ |
84c03869 | 817 | int avfilter_open(AVFilterContext **filter_ctx, AVFilter *filter, const char *inst_name); |
13ff8fd0 VS |
818 | |
819 | /** | |
49bd8e4b | 820 | * Initialize a filter. |
3fa3e4f4 | 821 | * |
664f6595 | 822 | * @param filter the filter to initialize |
13ff8fd0 VS |
823 | * @param args A string of parameters to use when initializing the filter. |
824 | * The format and meaning of this string varies by filter. | |
38efe768 | 825 | * @param opaque Any extra non-string data needed by the filter. The meaning |
13ff8fd0 | 826 | * of this parameter varies by filter. |
664f6595 | 827 | * @return zero on success |
13ff8fd0 | 828 | */ |
6e365c57 | 829 | int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque); |
13ff8fd0 VS |
830 | |
831 | /** | |
24de0edb | 832 | * Free a filter context. |
3fa3e4f4 | 833 | * |
24de0edb | 834 | * @param filter the filter to free |
13ff8fd0 | 835 | */ |
24de0edb | 836 | void avfilter_free(AVFilterContext *filter); |
a5cbb2f4 | 837 | |
13ff8fd0 | 838 | /** |
49bd8e4b | 839 | * Insert a filter in the middle of an existing link. |
3fa3e4f4 | 840 | * |
664f6595 VS |
841 | * @param link the link into which the filter should be inserted |
842 | * @param filt the filter to be inserted | |
486adc55 SS |
843 | * @param filt_srcpad_idx the input pad on the filter to connect |
844 | * @param filt_dstpad_idx the output pad on the filter to connect | |
664f6595 | 845 | * @return zero on success |
13ff8fd0 | 846 | */ |
35f3fdf4 | 847 | int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt, |
486adc55 | 848 | unsigned filt_srcpad_idx, unsigned filt_dstpad_idx); |
d3e57c15 | 849 | |
a9c81431 | 850 | /** |
49bd8e4b | 851 | * Insert a new pad. |
3fa3e4f4 | 852 | * |
38efe768 | 853 | * @param idx Insertion point. Pad is inserted at the end if this point |
a9c81431 VS |
854 | * is beyond the end of the list of pads. |
855 | * @param count Pointer to the number of pads in the list | |
856 | * @param padidx_off Offset within an AVFilterLink structure to the element | |
857 | * to increment when inserting a new pad causes link | |
858 | * numbering to change | |
859 | * @param pads Pointer to the pointer to the beginning of the list of pads | |
860 | * @param links Pointer to the pointer to the beginning of the list of links | |
861 | * @param newpad The new pad to add. A copy is made when adding. | |
862 | */ | |
863 | void avfilter_insert_pad(unsigned idx, unsigned *count, size_t padidx_off, | |
864 | AVFilterPad **pads, AVFilterLink ***links, | |
865 | AVFilterPad *newpad); | |
866 | ||
49bd8e4b | 867 | /** Insert a new input pad for the filter. */ |
a9c81431 VS |
868 | static inline void avfilter_insert_inpad(AVFilterContext *f, unsigned index, |
869 | AVFilterPad *p) | |
870 | { | |
871 | avfilter_insert_pad(index, &f->input_count, offsetof(AVFilterLink, dstpad), | |
872 | &f->input_pads, &f->inputs, p); | |
873 | } | |
874 | ||
49bd8e4b | 875 | /** Insert a new output pad for the filter. */ |
a9c81431 VS |
876 | static inline void avfilter_insert_outpad(AVFilterContext *f, unsigned index, |
877 | AVFilterPad *p) | |
878 | { | |
879 | avfilter_insert_pad(index, &f->output_count, offsetof(AVFilterLink, srcpad), | |
880 | &f->output_pads, &f->outputs, p); | |
881 | } | |
882 | ||
1c9e340d SS |
883 | /** |
884 | * Copy the frame properties of src to dst, without copying the actual | |
885 | * image data. | |
886 | * | |
887 | * @return 0 on success, a negative number on error. | |
888 | */ | |
889 | int avfilter_copy_frame_props(AVFilterBufferRef *dst, const AVFrame *src); | |
890 | ||
ab165047 AK |
891 | /** |
892 | * Copy the frame properties and data pointers of src to dst, without copying | |
893 | * the actual data. | |
894 | * | |
895 | * @return 0 on success, a negative number on error. | |
896 | */ | |
897 | int avfilter_copy_buf_props(AVFrame *dst, const AVFilterBufferRef *src); | |
898 | ||
153382e1 | 899 | #endif /* AVFILTER_AVFILTER_H */ |