avfilter.h 26.6 KB
Newer Older
V
Vitor Sessak 已提交
1
/*
2
 * filter layer
V
Vitor Sessak 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 * copyright (c) 2007 Bobby Bingham
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

22 23
#ifndef AVFILTER_AVFILTER_H
#define AVFILTER_AVFILTER_H
V
Vitor Sessak 已提交
24

25 26
#include "libavutil/avutil.h"

27
#define LIBAVFILTER_VERSION_MAJOR  1
28
#define LIBAVFILTER_VERSION_MINOR 19
29
#define LIBAVFILTER_VERSION_MICRO  0
30 31 32 33 34 35 36 37

#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
                                               LIBAVFILTER_VERSION_MINOR, \
                                               LIBAVFILTER_VERSION_MICRO)
#define LIBAVFILTER_VERSION     AV_VERSION(LIBAVFILTER_VERSION_MAJOR,   \
                                           LIBAVFILTER_VERSION_MINOR,   \
                                           LIBAVFILTER_VERSION_MICRO)
#define LIBAVFILTER_BUILD       LIBAVFILTER_VERSION_INT
V
Víctor Paesa 已提交
38

39
#include <stddef.h>
40
#include "libavcodec/avcodec.h"
V
Vitor Sessak 已提交
41

S
Stefano Sabatini 已提交
42 43 44 45 46
/**
 * Returns the LIBAVFILTER_VERSION_INT constant.
 */
unsigned avfilter_version(void);

47 48 49
/**
 * Returns the libavfilter build-time configuration.
 */
50
const char *avfilter_configuration(void);
51 52 53 54

/**
 * Returns the libavfilter license.
 */
55
const char *avfilter_license(void);
56 57


V
Vitor Sessak 已提交
58 59 60 61 62 63 64 65
typedef struct AVFilterContext AVFilterContext;
typedef struct AVFilterLink    AVFilterLink;
typedef struct AVFilterPad     AVFilterPad;

/* TODO: look for other flags which may be useful in this structure (interlace
 * flags, etc)
 */
/**
66
 * A reference-counted picture data type used by the filter system. Filters
V
Vitor Sessak 已提交
67
 * should not store pointers to this structure directly, but instead use the
68
 * AVFilterPicRef structure below.
V
Vitor Sessak 已提交
69 70 71
 */
typedef struct AVFilterPic
{
72 73 74
    uint8_t *data[4];           ///< picture data for each plane
    int linesize[4];            ///< number of bytes per line
    enum PixelFormat format;    ///< colorspace
V
Vitor Sessak 已提交
75

76 77 78
    unsigned refcount;          ///< number of references to this image

    /** private data to be used by a custom free function */
V
Vitor Sessak 已提交
79
    void *priv;
80 81
    /**
     * A pointer to the function to deallocate this image if the default
82
     * function is not sufficient. This could, for example, add the memory
83 84 85
     * back into a memory pool to be reused later without the overhead of
     * reallocating it from scratch.
     */
V
Vitor Sessak 已提交
86
    void (*free)(struct AVFilterPic *pic);
87 88

    int w, h;                  ///< width and height of the allocated buffer
V
Vitor Sessak 已提交
89 90 91
} AVFilterPic;

/**
92
 * A reference to an AVFilterPic. Since filters can manipulate the origin of
V
Vitor Sessak 已提交
93
 * a picture to, for example, crop image without any memcpy, the picture origin
94
 * and dimensions are per-reference properties. Linesize is also useful for
95
 * image flipping, frame to field filters, etc, and so is also per-reference.
V
Vitor Sessak 已提交
96
 *
V
Vitor Sessak 已提交
97
 * TODO: add anything necessary for frame reordering
V
Vitor Sessak 已提交
98 99 100
 */
typedef struct AVFilterPicRef
{
101 102 103 104 105
    AVFilterPic *pic;           ///< the picture that this is a reference to
    uint8_t *data[4];           ///< picture data for each plane
    int linesize[4];            ///< number of bytes per line
    int w;                      ///< image width
    int h;                      ///< image height
V
Vitor Sessak 已提交
106

107
    int64_t pts;                ///< presentation timestamp in units of 1/AV_TIME_BASE
108
    int64_t pos;                ///< byte position in stream, -1 if unknown
V
Vitor Sessak 已提交
109

110 111
    AVRational pixel_aspect;    ///< pixel aspect ratio

V
Vitor Sessak 已提交
112 113 114 115
    int perms;                  ///< permissions
#define AV_PERM_READ     0x01   ///< can read from the buffer
#define AV_PERM_WRITE    0x02   ///< can write to the buffer
#define AV_PERM_PRESERVE 0x04   ///< nobody else can overwrite the buffer
116 117
#define AV_PERM_REUSE    0x08   ///< can output the buffer multiple times, with the same contents each time
#define AV_PERM_REUSE2   0x10   ///< can output the buffer multiple times, modified each time
V
Vitor Sessak 已提交
118 119 120
} AVFilterPicRef;

/**
121
 * Adds a new reference to a picture.
122 123
 * @param ref   an existing reference to the picture
 * @param pmask a bitmask containing the allowable permissions in the new
124
 *              reference
125
 * @return      a new reference to the picture with the same properties as the
126
 *              old, excluding any permissions denied by pmask
V
Vitor Sessak 已提交
127
 */
128
AVFilterPicRef *avfilter_ref_pic(AVFilterPicRef *ref, int pmask);
V
Vitor Sessak 已提交
129 130

/**
131
 * Removes a reference to a picture. If this is the last reference to the
V
Vitor Sessak 已提交
132
 * picture, the picture itself is also automatically freed.
133
 * @param ref reference to the picture
V
Vitor Sessak 已提交
134 135 136
 */
void avfilter_unref_pic(AVFilterPicRef *ref);

V
Vitor Sessak 已提交
137 138 139 140 141 142 143
/**
 * A list of supported formats for one end of a filter link. This is used
 * during the format negotiation process to try to pick the best format to
 * use to minimize the number of necessary conversions. Each filter gives a
 * list of the formats supported by each input and output pad. The list
 * given for each pad need not be distinct - they may be references to the
 * same list of formats, as is often the case when a filter supports multiple
S
Stefano Sabatini 已提交
144
 * formats, but will always output the same format as it is given in input.
V
Vitor Sessak 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
 *
 * In this way, a list of possible input formats and a list of possible
 * output formats are associated with each link. When a set of formats is
 * negotiated over a link, the input and output lists are merged to form a
 * new list containing only the common elements of each list. In the case
 * that there were no common elements, a format conversion is necessary.
 * Otherwise, the lists are merged, and all other links which reference
 * either of the format lists involved in the merge are also affected.
 *
 * For example, consider the filter chain:
 * filter (a) --> (b) filter (b) --> (c) filter
 *
 * where the letters in parenthesis indicate a list of formats supported on
 * the input or output of the link. Suppose the lists are as follows:
 * (a) = {A, B}
 * (b) = {A, B, C}
 * (c) = {B, C}
 *
 * First, the first link's lists are merged, yielding:
 * filter (a) --> (a) filter (a) --> (c) filter
 *
 * Notice that format list (b) now refers to the same list as filter list (a).
 * Next, the lists for the second link are merged, yielding:
 * filter (a) --> (a) filter (a) --> (a) filter
 *
 * where (a) = {B}.
 *
 * Unfortunately, when the format lists at the two ends of a link are merged,
 * we must ensure that all links which reference either pre-merge format list
 * get updated as well. Therefore, we have the format list structure store a
 * pointer to each of the pointers to itself.
 */
typedef struct AVFilterFormats AVFilterFormats;
struct AVFilterFormats
{
    unsigned format_count;      ///< number of formats
181
    enum PixelFormat *formats;  ///< list of pixel formats
V
Vitor Sessak 已提交
182 183 184 185 186

    unsigned refcount;          ///< number of references to this list
    AVFilterFormats ***refs;    ///< references to this list
};

187 188 189 190 191 192
/**
 * Creates a list of supported formats. This is intended for use in
 * AVFilter->query_formats().
 * @param pix_fmt list of pixel formats, terminated by PIX_FMT_NONE
 * @return the format list, with no existing references
 */
193
AVFilterFormats *avfilter_make_format_list(const enum PixelFormat *pix_fmts);
194

195
/**
196 197 198
 * Adds pix_fmt to the list of pixel formats contained in *avff.
 * If *avff is NULL the function allocates the filter formats struct
 * and puts its pointer in *avff.
199 200 201 202
 *
 * @return a non negative value in case of success, or a negative
 * value corresponding to an AVERROR code in case of error
 */
203
int avfilter_add_colorspace(AVFilterFormats **avff, enum PixelFormat pix_fmt);
204

V
Vitor Sessak 已提交
205
/**
V
Vitor Sessak 已提交
206
 * Returns a list of all colorspaces supported by FFmpeg.
V
Vitor Sessak 已提交
207 208 209 210
 */
AVFilterFormats *avfilter_all_colorspaces(void);

/**
211
 * Returns a format list which contains the intersection of the formats of
212 213
 * a and b. Also, all the references of a, all the references of b, and
 * a and b themselves will be deallocated.
V
Vitor Sessak 已提交
214 215 216 217 218 219
 *
 * If a and b do not share any common formats, neither is modified, and NULL
 * is returned.
 */
AVFilterFormats *avfilter_merge_formats(AVFilterFormats *a, AVFilterFormats *b);

220
/**
221
 * Adds *ref as a new reference to formats.
222 223
 * That is the pointers will point like in the ascii art below:
 *   ________
224 225 226 227
 *  |formats |<--------.
 *  |  ____  |     ____|___________________
 *  | |refs| |    |  __|_
 *  | |* * | |    | |  | |  AVFilterLink
228
 *  | |* *--------->|*ref|
229 230
 *  | |____| |    | |____|
 *  |________|    |________________________
231
 */
232
void avfilter_formats_ref(AVFilterFormats *formats, AVFilterFormats **ref);
V
Vitor Sessak 已提交
233 234

/**
235 236 237
 * If *ref is non-NULL, removes *ref as a reference to the format list
 * it currently points to, deallocates that list if this was the last
 * reference, and sets *ref to NULL.
238 239 240 241 242 243 244 245 246 247
 *
 *         Before                                 After
 *   ________                               ________         NULL
 *  |formats |<--------.                   |formats |         ^
 *  |  ____  |     ____|________________   |  ____  |     ____|________________
 *  | |refs| |    |  __|_                  | |refs| |    |  __|_
 *  | |* * | |    | |  | |  AVFilterLink   | |* * | |    | |  | |  AVFilterLink
 *  | |* *--------->|*ref|                 | |*   | |    | |*ref|
 *  | |____| |    | |____|                 | |____| |    | |____|
 *  |________|    |_____________________   |________|    |_____________________
V
Vitor Sessak 已提交
248 249 250
 */
void avfilter_formats_unref(AVFilterFormats **ref);

251 252 253 254
/**
 *
 *         Before                                 After
 *   ________                         ________
255
 *  |formats |<---------.            |formats |<---------.
256 257 258 259 260 261 262 263
 *  |  ____  |       ___|___         |  ____  |       ___|___
 *  | |refs| |      |   |   |        | |refs| |      |   |   |   NULL
 *  | |* *--------->|*oldref|        | |* *--------->|*newref|     ^
 *  | |* * | |      |_______|        | |* * | |      |_______|  ___|___
 *  | |____| |                       | |____| |                |   |   |
 *  |________|                       |________|                |*oldref|
 *                                                             |_______|
 */
M
Michael Niedermayer 已提交
264 265 266
void avfilter_formats_changeref(AVFilterFormats **oldref,
                                AVFilterFormats **newref);

267
/**
268
 * A filter pad used for either input or output.
269
 */
V
Vitor Sessak 已提交
270 271 272
struct AVFilterPad
{
    /**
273 274
     * Pad name. The name is unique among inputs and among outputs, but an
     * input may have the same name as an output. This may be NULL if this
275
     * pad has no need to ever be referenced by name.
V
Vitor Sessak 已提交
276
     */
V
Vitor Sessak 已提交
277
    const char *name;
V
Vitor Sessak 已提交
278 279

    /**
280
     * AVFilterPad type. Only video supported now, hopefully someone will
V
Vitor Sessak 已提交
281 282
     * add audio in the future.
     */
283
    enum AVMediaType type;
V
Vitor Sessak 已提交
284

285
    /**
286
     * Minimum required permissions on incoming buffers. Any buffer with
287 288 289 290 291 292 293 294
     * insufficient permissions will be automatically copied by the filter
     * system to a new buffer which provides the needed access permissions.
     *
     * Input pads only.
     */
    int min_perms;

    /**
295
     * Permissions which are not accepted on incoming buffers. Any buffer
296 297
     * which has any of these permissions set will be automatically copied
     * by the filter system to a new buffer which does not have those
298
     * permissions. This can be used to easily disallow buffers with
299
     * AV_PERM_REUSE.
300 301 302 303 304
     *
     * Input pads only.
     */
    int rej_perms;

V
Vitor Sessak 已提交
305
    /**
306
     * Callback called before passing the first slice of a new frame. If
V
Vitor Sessak 已提交
307 308
     * NULL, the filter layer will default to storing a reference to the
     * picture inside the link structure.
309 310
     *
     * Input video pads only.
V
Vitor Sessak 已提交
311 312 313 314
     */
    void (*start_frame)(AVFilterLink *link, AVFilterPicRef *picref);

    /**
315
     * Callback function to get a buffer. If NULL, the filter system will
316
     * use avfilter_default_get_video_buffer().
317 318
     *
     * Input video pads only.
V
Vitor Sessak 已提交
319
     */
320
    AVFilterPicRef *(*get_video_buffer)(AVFilterLink *link, int perms, int w, int h);
V
Vitor Sessak 已提交
321 322

    /**
323
     * Callback called after the slices of a frame are completely sent. If
V
Vitor Sessak 已提交
324 325
     * NULL, the filter layer will default to releasing the reference stored
     * in the link structure during start_frame().
326 327
     *
     * Input video pads only.
V
Vitor Sessak 已提交
328 329 330 331
     */
    void (*end_frame)(AVFilterLink *link);

    /**
332
     * Slice drawing callback. This is where a filter receives video data
333 334 335
     * and should do its processing.
     *
     * Input video pads only.
V
Vitor Sessak 已提交
336
     */
337
    void (*draw_slice)(AVFilterLink *link, int y, int height, int slice_dir);
V
Vitor Sessak 已提交
338

339
    /**
340
     * Frame poll callback. This returns the number of immediately available
341 342 343 344 345 346 347 348 349
     * frames. It should return a positive value if the next request_frame()
     * is guaranteed to return one frame (with no delay).
     *
     * Defaults to just calling the source poll_frame() method.
     *
     * Output video pads only.
     */
    int (*poll_frame)(AVFilterLink *link);

V
Vitor Sessak 已提交
350
    /**
351 352
     * Frame request callback. A call to this should result in at least one
     * frame being output over the given link. This should return zero on
353 354 355
     * success, and another value on error.
     *
     * Output video pads only.
V
Vitor Sessak 已提交
356
     */
357
    int (*request_frame)(AVFilterLink *link);
V
Vitor Sessak 已提交
358 359

    /**
360 361 362
     * Link configuration callback.
     *
     * For output pads, this should set the link properties such as
363
     * width/height. This should NOT set the format property - that is
364 365
     * negotiated between filters by the filter system using the
     * query_formats() callback before this function is called.
366 367 368
     *
     * For input pads, this should check the properties of the link, and update
     * the filter's internal state as necessary.
369 370 371
     *
     * For both input and output filters, this should return zero on success,
     * and another value on error.
V
Vitor Sessak 已提交
372
     */
373
    int (*config_props)(AVFilterLink *link);
V
Vitor Sessak 已提交
374 375
};

376
/** default handler for start_frame() for video inputs */
V
Vitor Sessak 已提交
377
void avfilter_default_start_frame(AVFilterLink *link, AVFilterPicRef *picref);
378
/** default handler for draw_slice() for video inputs */
379
void avfilter_default_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
380
/** default handler for end_frame() for video inputs */
V
Vitor Sessak 已提交
381
void avfilter_default_end_frame(AVFilterLink *link);
382
/** default handler for config_props() for video outputs */
383
int avfilter_default_config_output_link(AVFilterLink *link);
384
/** default handler for config_props() for video inputs */
385
int avfilter_default_config_input_link (AVFilterLink *link);
386
/** default handler for get_video_buffer() for video inputs */
387
AVFilterPicRef *avfilter_default_get_video_buffer(AVFilterLink *link,
388
                                                  int perms, int w, int h);
V
Vitor Sessak 已提交
389 390 391 392 393 394 395 396
/**
 * A helper for query_formats() which sets all links to the same list of
 * formats. If there are no links hooked to this filter, the list of formats is
 * freed.
 */
void avfilter_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats);
/** Default handler for query_formats() */
int avfilter_default_query_formats(AVFilterContext *ctx);
V
Vitor Sessak 已提交
397

398 399 400 401 402 403 404 405 406 407 408 409 410
/** start_frame() handler for filters which simply pass video along */
void avfilter_null_start_frame(AVFilterLink *link, AVFilterPicRef *picref);

/** draw_slice() handler for filters which simply pass video along */
void avfilter_null_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);

/** end_frame() handler for filters which simply pass video along */
void avfilter_null_end_frame(AVFilterLink *link);

/** get_video_buffer() handler for filters which simply pass video along */
AVFilterPicRef *avfilter_null_get_video_buffer(AVFilterLink *link,
                                                  int perms, int w, int h);

411
/**
412
 * Filter definition. This defines the pads a filter contains, and all the
413 414
 * callback functions used to interact with the filter.
 */
S
Stefano Sabatini 已提交
415
typedef struct AVFilter
V
Vitor Sessak 已提交
416
{
V
Vitor Sessak 已提交
417
    const char *name;         ///< filter name
V
Vitor Sessak 已提交
418

419
    int priv_size;      ///< size of private data to allocate for the filter
V
Vitor Sessak 已提交
420

421
    /**
422 423
     * Filter initialization function. Args contains the user-supplied
     * parameters. FIXME: maybe an AVOption-based system would be better?
424 425
     * opaque is data provided by the code requesting creation of the filter,
     * and is used to pass data to the filter.
426
     */
427
    int (*init)(AVFilterContext *ctx, const char *args, void *opaque);
428 429

    /**
430 431
     * Filter uninitialization function. Should deallocate any memory held
     * by the filter, release any picture references, etc. This does not need
432 433
     * to deallocate the AVFilterContext->priv memory itself.
     */
V
Vitor Sessak 已提交
434 435
    void (*uninit)(AVFilterContext *ctx);

V
Vitor Sessak 已提交
436
    /**
437
     * Queries formats supported by the filter and its pads, and sets the
V
Vitor Sessak 已提交
438 439 440
     * in_formats for links connected to its output pads, and out_formats
     * for links connected to its input pads.
     *
441 442
     * @return zero on success, a negative value corresponding to an
     * AVERROR code otherwise
V
Vitor Sessak 已提交
443 444 445
     */
    int (*query_formats)(AVFilterContext *);

446 447
    const AVFilterPad *inputs;  ///< NULL terminated list of inputs. NULL if none
    const AVFilterPad *outputs; ///< NULL terminated list of outputs. NULL if none
448 449 450 451 452 453

    /**
     * A description for the filter. You should use the
     * NULL_IF_CONFIG_SMALL() macro to define it.
     */
    const char *description;
V
Vitor Sessak 已提交
454 455
} AVFilter;

456
/** An instance of a filter */
V
Vitor Sessak 已提交
457 458
struct AVFilterContext
{
459
    const AVClass *av_class;              ///< needed for av_log()
V
Vitor Sessak 已提交
460

461
    AVFilter *filter;               ///< the AVFilter of which this is an instance
V
Vitor Sessak 已提交
462

463
    char *name;                     ///< name of this filter instance
464

465 466 467
    unsigned input_count;           ///< number of input pads
    AVFilterPad   *input_pads;      ///< array of input pads
    AVFilterLink **inputs;          ///< array of pointers to input links
V
Vitor Sessak 已提交
468

469 470 471
    unsigned output_count;          ///< number of output pads
    AVFilterPad   *output_pads;     ///< array of output pads
    AVFilterLink **outputs;         ///< array of pointers to output links
V
Vitor Sessak 已提交
472

473
    void *priv;                     ///< private data for use by the filter
V
Vitor Sessak 已提交
474 475
};

476
/**
477
 * A link between two filters. This contains pointers to the source and
478
 * destination filters between which this link exists, and the indexes of
479
 * the pads involved. In addition, this link also contains the parameters
480
 * which have been negotiated and agreed upon between the filter, such as
481
 * image dimensions, format, etc.
482
 */
V
Vitor Sessak 已提交
483 484
struct AVFilterLink
{
485 486
    AVFilterContext *src;       ///< source filter
    unsigned int srcpad;        ///< index of the output pad on the source filter
V
Vitor Sessak 已提交
487

488 489
    AVFilterContext *dst;       ///< dest filter
    unsigned int dstpad;        ///< index of the input pad on the dest filter
V
Vitor Sessak 已提交
490

491 492 493 494 495 496 497
    /** stage of the initialization of the link properties (dimensions, etc) */
    enum {
        AVLINK_UNINIT = 0,      ///< not started
        AVLINK_STARTINIT,       ///< started, but incomplete
        AVLINK_INIT             ///< complete
    } init_state;

498 499 500
    int w;                      ///< agreed upon image width
    int h;                      ///< agreed upon image height
    enum PixelFormat format;    ///< agreed upon image colorspace
V
Vitor Sessak 已提交
501

V
Vitor Sessak 已提交
502 503 504 505 506 507 508 509
    /**
     * Lists of formats supported by the input and output filters respectively.
     * These lists are used for negotiating the format to actually be used,
     * which will be loaded into the format member, above, when chosen.
     */
    AVFilterFormats *in_formats;
    AVFilterFormats *out_formats;

510 511
    /**
     * The picture reference currently being sent across the link by the source
512
     * filter. This is used internally by the filter system to allow
513
     * automatic copying of pictures which do not have sufficient permissions
514
     * for the destination. This should not be accessed directly by the
515 516 517 518
     * filters.
     */
    AVFilterPicRef *srcpic;

V
Vitor Sessak 已提交
519
    AVFilterPicRef *cur_pic;
520
    AVFilterPicRef *outpic;
V
Vitor Sessak 已提交
521 522
};

523
/**
524
 * Links two filters together.
525 526 527 528 529
 * @param src    the source filter
 * @param srcpad index of the output pad on the source filter
 * @param dst    the destination filter
 * @param dstpad index of the input pad on the destination filter
 * @return       zero on success
530
 */
V
Vitor Sessak 已提交
531 532 533
int avfilter_link(AVFilterContext *src, unsigned srcpad,
                  AVFilterContext *dst, unsigned dstpad);

534
/**
535
 * Negotiates the colorspace, dimensions, etc of all inputs to a filter.
536 537
 * @param filter the filter to negotiate the properties for its inputs
 * @return       zero on successful negotiation
538
 */
539
int avfilter_config_links(AVFilterContext *filter);
540

541
/**
542
 * Requests a picture buffer with a specific set of permissions.
543
 * @param link  the output link to the filter from which the picture will
544
 *              be requested
545
 * @param perms the required access permissions
546 547
 * @param w     the minimum width of the buffer to allocate
 * @param h     the minimum height of the buffer to allocate
548
 * @return      A reference to the picture. This must be unreferenced with
549 550
 *              avfilter_unref_pic when you are finished with it.
 */
551 552
AVFilterPicRef *avfilter_get_video_buffer(AVFilterLink *link, int perms,
                                          int w, int h);
553 554

/**
555
 * Requests an input frame from the filter at the other end of the link.
556 557
 * @param link the input link
 * @return     zero on success
558
 */
V
Vitor Sessak 已提交
559
int avfilter_request_frame(AVFilterLink *link);
560

561
/**
562
 * Polls a frame from the filter chain.
563
 * @param  link the input link
564 565
 * @return the number of immediately available frames, a negative
 * number in case of error
566 567 568
 */
int avfilter_poll_frame(AVFilterLink *link);

569
/**
570
 * Notifies the next filter of the start of a frame.
571
 * @param link   the output link the frame will be sent over
572
 * @param picref A reference to the frame about to be sent. The data for this
573
 *               frame need only be valid once draw_slice() is called for that
574
 *               portion. The receiving filter will free this reference when
575 576
 *               it no longer needs it.
 */
V
Vitor Sessak 已提交
577
void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref);
578 579

/**
580
 * Notifies the next filter that the current frame has finished.
581
 * @param link the output link the frame was sent over
582
 */
V
Vitor Sessak 已提交
583
void avfilter_end_frame(AVFilterLink *link);
584 585

/**
586
 * Sends a slice to the next filter.
587 588 589 590 591
 *
 * Slices have to be provided in sequential order, either in
 * top-bottom or bottom-top order. If slices are provided in
 * non-sequential order the behavior of the function is undefined.
 *
592 593 594
 * @param link the output link over which the frame is being sent
 * @param y    offset in pixels from the top of the image for this slice
 * @param h    height of this slice in pixels
595 596 597 598
 * @param slice_dir the assumed direction for sending slices,
 *             from the top slice to the bottom slice if the value is 1,
 *             from the bottom slice to the top slice if the value is -1,
 *             for other values the behavior of the function is undefined.
599
 */
600
void avfilter_draw_slice(AVFilterLink *link, int y, int h, int slice_dir);
V
Vitor Sessak 已提交
601

602
/** Initializes the filter system. Registers all builtin filters. */
V
Oops  
Vitor Sessak 已提交
603
void avfilter_register_all(void);
604

605
/** Uninitializes the filter system. Unregisters all filters. */
V
Vitor Sessak 已提交
606
void avfilter_uninit(void);
607 608

/**
609
 * Registers a filter. This is only needed if you plan to use
610 611 612
 * avfilter_get_by_name later to lookup the AVFilter structure by name. A
 * filter can still by instantiated with avfilter_open even if it is not
 * registered.
613
 * @param filter the filter to register
614 615
 * @return 0 if the registration was succesfull, a negative value
 * otherwise
616
 */
617
int avfilter_register(AVFilter *filter);
618 619

/**
620 621 622
 * Gets a filter definition matching the given name.
 * @param name the filter name to find
 * @return     the filter definition, if any matching one is registered.
623 624
 *             NULL if none found.
 */
V
Vitor Sessak 已提交
625
AVFilter *avfilter_get_by_name(const char *name);
V
Vitor Sessak 已提交
626

S
Stefano Sabatini 已提交
627 628 629 630 631 632 633 634
/**
 * If filter is NULL, returns a pointer to the first registered filter pointer,
 * if filter is non-NULL, returns the next pointer after filter.
 * If the returned pointer points to NULL, the last registered filter
 * was already reached.
 */
AVFilter **av_filter_next(AVFilter **filter);

635
/**
636
 * Creates a filter instance.
637
 * @param filter    the filter to create an instance of
638 639
 * @param inst_name Name to give to the new instance. Can be NULL for none.
 * @return          Pointer to the new instance on success. NULL on failure.
640
 */
V
Vitor Sessak 已提交
641
AVFilterContext *avfilter_open(AVFilter *filter, const char *inst_name);
642 643

/**
644
 * Initializes a filter.
645
 * @param filter the filter to initialize
646 647
 * @param args   A string of parameters to use when initializing the filter.
 *               The format and meaning of this string varies by filter.
648
 * @param opaque Any extra non-string data needed by the filter. The meaning
649
 *               of this parameter varies by filter.
650
 * @return       zero on success
651
 */
652
int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque);
653 654

/**
655
 * Destroys a filter.
656
 * @param filter the filter to destroy
657
 */
V
Vitor Sessak 已提交
658 659
void avfilter_destroy(AVFilterContext *filter);

660
/**
661
 * Inserts a filter in the middle of an existing link.
662 663 664 665 666
 * @param link the link into which the filter should be inserted
 * @param filt the filter to be inserted
 * @param in   the input pad on the filter to connect
 * @param out  the output pad on the filter to connect
 * @return     zero on success
667
 */
V
Vitor Sessak 已提交
668 669
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
                           unsigned in, unsigned out);
670

671
/**
672
 * Inserts a new pad.
673
 * @param idx Insertion point. Pad is inserted at the end if this point
674 675 676 677 678 679 680 681 682 683 684 685 686
 *            is beyond the end of the list of pads.
 * @param count Pointer to the number of pads in the list
 * @param padidx_off Offset within an AVFilterLink structure to the element
 *                   to increment when inserting a new pad causes link
 *                   numbering to change
 * @param pads Pointer to the pointer to the beginning of the list of pads
 * @param links Pointer to the pointer to the beginning of the list of links
 * @param newpad The new pad to add. A copy is made when adding.
 */
void avfilter_insert_pad(unsigned idx, unsigned *count, size_t padidx_off,
                         AVFilterPad **pads, AVFilterLink ***links,
                         AVFilterPad *newpad);

687
/** Inserts a new input pad for the filter. */
688 689 690 691 692 693 694
static inline void avfilter_insert_inpad(AVFilterContext *f, unsigned index,
                                         AVFilterPad *p)
{
    avfilter_insert_pad(index, &f->input_count, offsetof(AVFilterLink, dstpad),
                        &f->input_pads, &f->inputs, p);
}

695
/** Inserts a new output pad for the filter. */
696 697 698 699 700 701 702
static inline void avfilter_insert_outpad(AVFilterContext *f, unsigned index,
                                          AVFilterPad *p)
{
    avfilter_insert_pad(index, &f->output_count, offsetof(AVFilterLink, srcpad),
                        &f->output_pads, &f->outputs, p);
}

703
#endif  /* AVFILTER_AVFILTER_H */