]> git.sesse.net Git - ffmpeg/blobdiff - libavfilter/avfilter.h
Use '[' and ']' for label naming
[ffmpeg] / libavfilter / avfilter.h
index 4a48defdb6ac595436543d52163a4a656ea96ea2..b660be74f4777b0b34c62960654739ba9ce333d1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Filter layer
+ * filter layer
  * copyright (c) 2007 Bobby Bingham
  *
  * This file is part of FFmpeg.
 #ifndef FFMPEG_AVFILTER_H
 #define FFMPEG_AVFILTER_H
 
+#define LIBAVFILTER_VERSION_MAJOR  0
+#define LIBAVFILTER_VERSION_MINOR  0
+#define LIBAVFILTER_VERSION_MICRO  0
+
+#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
+
 #include <stddef.h>
-#include "avcodec.h"
+#include "libavcodec/avcodec.h"
 
 typedef struct AVFilterContext AVFilterContext;
 typedef struct AVFilterLink    AVFilterLink;
@@ -35,7 +47,7 @@ typedef struct AVFilterPad     AVFilterPad;
 /**
  * A reference-counted picture data type used by the filter system.  Filters
  * should not store pointers to this structure directly, but instead use the
- * AVFilterPicRef structure below
+ * AVFilterPicRef structure below.
  */
 typedef struct AVFilterPic
 {
@@ -86,10 +98,10 @@ typedef struct AVFilterPicRef
 
 /**
  * Add a new reference to a picture.
- * @param ref   An existing reference to the picture
- * @param pmask A bitmask containing the allowable permissions in the new
+ * @param ref   an existing reference to the picture
+ * @param pmask a bitmask containing the allowable permissions in the new
  *              reference
- * @return      A new reference to the picture with the same properties as the
+ * @return      a new reference to the picture with the same properties as the
  *              old, excluding any permissions denied by pmask
  */
 AVFilterPicRef *avfilter_ref_pic(AVFilterPicRef *ref, int pmask);
@@ -97,7 +109,7 @@ AVFilterPicRef *avfilter_ref_pic(AVFilterPicRef *ref, int pmask);
 /**
  * Remove a reference to a picture.  If this is the last reference to the
  * picture, the picture itself is also automatically freed.
- * @param ref Reference to the picture.
+ * @param ref reference to the picture
  */
 void avfilter_unref_pic(AVFilterPicRef *ref);
 
@@ -154,40 +166,75 @@ struct AVFilterFormats
 /**
  * Helper function to create a list of supported formats.  This is intended
  * for use in AVFilter->query_formats().
- * @param len The number of formats supported
- * @param ... A list of the supported formats
- * @return    The format list, with no existing references
+ * @param len the number of formats supported
+ * @param ... a list of the supported formats
+ * @return    the format list, with no existing references
  */
 AVFilterFormats *avfilter_make_format_list(int len, ...);
 
 /**
- * Returns a fairly comprehensive list of colorspaces which are supported by
- * many of the included filters. This is not truly "all" the colorspaces, but
- * it is most of them, and it is the most commonly supported large subset.
+ * Returns a list of all colorspaces supported by FFmpeg.
  */
 AVFilterFormats *avfilter_all_colorspaces(void);
 
 /**
- * If a and b share at least one common format, they are merged into a new
- * format list which is returned.  All the references to a and b are updated
- * to point to this new list, and a and b are deallocated.
+ * Returns a format list which contains the intersection of the formats of
+ * a and b. And all the references of a and b, and a and b will be
+ * deallocated.
  *
  * 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);
 
-/** Adds *ref as a new reference to f */
-void avfilter_formats_ref(AVFilterFormats *f, AVFilterFormats **ref);
+/**
+ * Adds *ref as a new reference to formats.
+ * That is the pointers will point like in the ascii art below:
+ *   ________
+ *  |formats |<--------.
+ *  |  ____  |     ____|___________________
+ *  | |refs| |    |  __|_
+ *  | |* * | |    | |  | |  AVFilterLink
+ *  | |* *--------->|*ref|
+ *  | |____| |    | |____|
+ *  |________|    |________________________
+ */
+void avfilter_formats_ref(AVFilterFormats *formats, AVFilterFormats **ref);
 
 /**
  * Remove *ref as a reference to the format list it currently points to,
- * deallocate that list if this was the last reference, and set *ref to NULL
+ * deallocate that list if this was the last reference, and set *ref to NULL.
+ *
+ *         Before                                 After
+ *   ________                               ________         NULL
+ *  |formats |<--------.                   |formats |         ^
+ *  |  ____  |     ____|________________   |  ____  |     ____|________________
+ *  | |refs| |    |  __|_                  | |refs| |    |  __|_
+ *  | |* * | |    | |  | |  AVFilterLink   | |* * | |    | |  | |  AVFilterLink
+ *  | |* *--------->|*ref|                 | |*   | |    | |*ref|
+ *  | |____| |    | |____|                 | |____| |    | |____|
+ *  |________|    |_____________________   |________|    |_____________________
  */
 void avfilter_formats_unref(AVFilterFormats **ref);
 
 /**
- * A filter pad used for either input or output
+ *
+ *         Before                                 After
+ *   ________                         ________
+ *  |formats |<---------.            |formats |<---------.
+ *  |  ____  |       ___|___         |  ____  |       ___|___
+ *  | |refs| |      |   |   |        | |refs| |      |   |   |   NULL
+ *  | |* *--------->|*oldref|        | |* *--------->|*newref|     ^
+ *  | |* * | |      |_______|        | |* * | |      |_______|  ___|___
+ *  | |____| |                       | |____| |                |   |   |
+ *  |________|                       |________|                |*oldref|
+ *                                                             |_______|
+ */
+void avfilter_formats_changeref(AVFilterFormats **oldref,
+                                AVFilterFormats **newref);
+
+/**
+ * A filter pad used for either input or output.
  */
 struct AVFilterPad
 {
@@ -196,14 +243,13 @@ struct AVFilterPad
      * input may have the same name as an output.  This may be NULL if this
      * pad has no need to ever be referenced by name.
      */
-    char *name;
+    const char *name;
 
     /**
      * AVFilterPad type.  Only video supported now, hopefully someone will
      * add audio in the future.
      */
-    int type;
-#define AV_PAD_VIDEO 0      ///< video pad
+    enum CodecType type;
 
     /**
      * Minimum required permissions on incoming buffers.  Any buffers with
@@ -258,6 +304,17 @@ struct AVFilterPad
      */
     void (*draw_slice)(AVFilterLink *link, int y, int height);
 
+    /**
+     * Frame poll callback.  This returns the number of immediately available
+     * 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);
+
     /**
      * 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
@@ -304,17 +361,13 @@ void avfilter_set_common_formats(AVFilterContext *ctx, AVFilterFormats *formats)
 /** Default handler for query_formats() */
 int avfilter_default_query_formats(AVFilterContext *ctx);
 
-void avfilter_formats_changeref(AVFilterFormats **oldref,
-                                AVFilterFormats **newref);
-
 /**
  * Filter definition.  This defines the pads a filter contains, and all the
  * callback functions used to interact with the filter.
  */
 typedef struct
 {
-    char *name;         ///< filter name
-    char *author;       ///< filter author
+    const char *name;         ///< filter name
 
     int priv_size;      ///< size of private data to allocate for the filter
 
@@ -349,9 +402,9 @@ typedef struct
 /** An instance of a filter */
 struct AVFilterContext
 {
-    AVClass *av_class;              ///< Needed for av_log()
+    const AVClass *av_class;              ///< needed for av_log()
 
-    AVFilter *filter;               ///< The AVFilter of which this is an instance
+    AVFilter *filter;               ///< the AVFilter of which this is an instance
 
     char *name;                     ///< name of this filter instance
 
@@ -367,7 +420,7 @@ struct AVFilterContext
 };
 
 /**
- * A links between two filters.  This contains pointers to the source and
+ * A link between two filters.  This contains pointers to the source and
  * destination filters between which this link exists, and the indices of
  * the pads involved.  In addition, this link also contains the parameters
  * which have been negotiated and agreed upon between the filter, such as
@@ -381,6 +434,13 @@ struct AVFilterLink
     AVFilterContext *dst;       ///< dest filter
     unsigned int dstpad;        ///< index of the input pad on the dest filter
 
+    /** 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;
+
     int w;                      ///< agreed upon image width
     int h;                      ///< agreed upon image height
     enum PixelFormat format;    ///< agreed upon image colorspace
@@ -396,7 +456,7 @@ struct AVFilterLink
     /**
      * The picture reference currently being sent across the link by the source
      * filter.  This is used internally by the filter system to allow
-     * automatic copying of pictures which d not have sufficient permissions
+     * automatic copying of pictures which do not have sufficient permissions
      * for the destination.  This should not be accessed directly by the
      * filters.
      */
@@ -407,28 +467,28 @@ struct AVFilterLink
 };
 
 /**
- * Link two filters together
- * @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
+ * Link two filters together.
+ * @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
  */
 int avfilter_link(AVFilterContext *src, unsigned srcpad,
                   AVFilterContext *dst, unsigned dstpad);
 
 /**
- * Negotiate the colorspace, dimensions, etc of a link
- * @param link The link to negotiate the properties of
- * @return     Zero on successful negotiation
+ * Negotiate the colorspace, dimensions, etc of all inputs to a filter.
+ * @param filter the filter to negotiate the properties for its inputs
+ * @return       zero on successful negotiation
  */
-int avfilter_config_link(AVFilterLink *link);
+int avfilter_config_links(AVFilterContext *filter);
 
 /**
  * Request a picture buffer with a specific set of permissions
- * @param link  The output link to the filter from which the picture will
+ * @param link  the output link to the filter from which the picture will
  *              be requested
- * @param perms The required access permissions
+ * @param perms the required access permissions
  * @return      A reference to the picture.  This must be unreferenced with
  *              avfilter_unref_pic when you are finished with it.
  */
@@ -436,14 +496,21 @@ AVFilterPicRef *avfilter_get_video_buffer(AVFilterLink *link, int perms);
 
 /**
  * Request an input frame from the filter at the other end of the link.
- * @param link The input link
- * @return     Zero on success
+ * @param link the input link
+ * @return     zero on success
+ */
+int avfilter_request_frame(AVFilterLink *link);
+
+/**
+ * Poll a frame from the filter chain.
+ * @param  link the input link
+ * @return      the number of imediately available frames
  */
-int  avfilter_request_frame(AVFilterLink *link);
+int avfilter_poll_frame(AVFilterLink *link);
 
 /**
  * Notify the next filter of the start of a frame.
- * @param link   The output link the frame will be sent over
+ * @param link   the output link the frame will be sent over
  * @param picref A reference to the frame about to be sent.  The data for this
  *               frame need only be valid once draw_slice() is called for that
  *               portion.  The receiving filter will free this reference when
@@ -453,20 +520,20 @@ void avfilter_start_frame(AVFilterLink *link, AVFilterPicRef *picref);
 
 /**
  * Notify the next filter that the current frame has finished
- * @param link The output link the frame was sent over
+ * @param link the output link the frame was sent over
  */
 void avfilter_end_frame(AVFilterLink *link);
 
 /**
- * Send a slice to the next filter
- * @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
+ * Send a slice to the next filter.
+ * @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
  */
 void avfilter_draw_slice(AVFilterLink *link, int y, int h);
 
 /** Initialize the filter system.  Registers all builtin filters */
-void avfilter_init(void);
+void avfilter_register_all(void);
 
 /** Uninitialize the filter system.  Unregisters all filters */
 void avfilter_uninit(void);
@@ -476,56 +543,56 @@ void avfilter_uninit(void);
  * 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.
- * @param filter The filter to register
+ * @param filter the filter to register
  */
 void avfilter_register(AVFilter *filter);
 
 /**
- * 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.
+ * 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.
  *             NULL if none found.
  */
-AVFilter *avfilter_get_by_name(char *name);
+AVFilter *avfilter_get_by_name(const char *name);
 
 /**
- * Create a filter instance
- * @param filter    The filter to create an instance of
+ * Create a filter instance.
+ * @param filter    the filter to create an instance of
  * @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.
  */
-AVFilterContext *avfilter_open(AVFilter *filter, char *inst_name);
+AVFilterContext *avfilter_open(AVFilter *filter, const char *inst_name);
 
 /**
- * Initialize a filter
- * @param filter The filter to initialize
+ * Initialize a filter.
+ * @param filter the filter to initialize
  * @param args   A string of parameters to use when initializing the filter.
  *               The format and meaning of this string varies by filter.
  * @param opaque Any extra non-string data needed by the filter.  The meaning
  *               of this parameter varies by filter.
- * @return       Zero on success
+ * @return       zero on success
  */
 int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque);
 
 /**
- * Destroy a filter
- * @param filter The filter to destroy
+ * Destroy a filter.
+ * @param filter the filter to destroy
  */
 void avfilter_destroy(AVFilterContext *filter);
 
 /**
  * Insert a filter in the middle of an existing link.
- * @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
+ * @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
  */
 int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
                            unsigned in, unsigned out);
 
 /**
- * Insert a new pad
+ * Insert a new pad.
  * @param idx Insertion point.  Pad is inserted at the end if this point
  *            is beyond the end of the list of pads.
  * @param count Pointer to the number of pads in the list