| |
| The new caps code uses the type name GstCaps2 and the function |
| names gst_caps2_*(). Before the CAPS branch is merged, there |
| will be a global change from caps2 to caps. Since GstCaps is |
| no longer defined, it no longer compiles, thus highlighting |
| exactly what needs to be changed in an element. |
| |
| |
| |
| Pad Templates: |
| |
| Old style: |
| |
| GST_PAD_TEMPLATE_FACTORY (fakesrc_src_factory, |
| "src%d", |
| GST_PAD_SRC, |
| GST_PAD_REQUEST, |
| GST_CAPS_ANY |
| ); |
| |
| New style: |
| |
| GstStaticPadTemplate fakesrc_src_template = GST_STATIC_PAD_TEMPLATE ( |
| "src%d", |
| GST_PAD_SRC, |
| GST_PAD_REQUEST, |
| GST_STATIC_CAPS2_ANY |
| ); |
| |
| The old style defined a function called fakesrc_src_factory(), which, |
| when called, returns a pad template. The new style defines a |
| GstStaticPadTemplate, which can be converted to a GstPadTemplate |
| by the function gst_static_pad_template_get(). The 4th argument |
| is also different -- previously it would call the GST_CAPS_NEW() |
| function. Now it is a GstStaticCaps. |
| |
| Not every pad template can be converted to a GstStaticPadTemplate, |
| particularly those which create caps from another source at runtime, |
| such as videotestsrc. |
| |
| Caps: |
| |
| Old style: |
| |
| GST_CAPS_NEW ( |
| "sinesrc_src", |
| "audio/x-raw-int", |
| "endianness", GST_PROPS_INT (G_BYTE_ORDER), |
| "signed", GST_PROPS_BOOLEAN (TRUE), |
| "width", GST_PROPS_INT (16), |
| "depth", GST_PROPS_INT (16), |
| "rate", GST_PROPS_INT_RANGE (8000, 48000), |
| "channels", GST_PROPS_INT (1) |
| ) |
| |
| New style: |
| |
| GST_STATIC_CAPS2 ( "audio/x-raw-int, " |
| "endianness = (int) " G_STRINGIFY (G_BYTE_ORDER) ", " |
| "signed = (boolean) true, " |
| "width = (int) 16, " |
| "depth = (int) 16, " |
| "rate = (int) [ 8000, 48000 ], " |
| "channels = (int) 1" |
| ) |
| |
| The old style calls a function that creates a GstCaps. The new style |
| stores a string in a GstStaticCaps2, and this string is converted to |
| a caps in the function gst_static_caps2_get(). |
| |
| Note that the old caps name is no longer used. |
| |
| Old style: |
| |
| caps = GST_CAPS_NEW ("videotestsrc_filter", |
| "video/x-raw-rgb", |
| "bpp", GST_PROPS_INT(format->bitspp), |
| "endianness", GST_PROPS_INT(endianness), |
| "depth", GST_PROPS_INT(format->depth), |
| "red_mask", GST_PROPS_INT(format->red_mask), |
| "green_mask", GST_PROPS_INT(format->green_mask), |
| "blue_mask", GST_PROPS_INT(format->blue_mask)); |
| |
| New style: |
| |
| caps = gst_caps2_new_simple("video/x-raw-rgb", |
| "bpp", G_TYPE_INT, format->bitspp, |
| "endianness", G_TYPE_INT, endianness, |
| "depth", G_TYPE_INT, format->depth, |
| "red_mask", G_TYPE_INT, format->red_mask, |
| "green_mask", G_TYPE_INT, format->green_mask, |
| "blue_mask", G_TYPE_INT, format->blue_mask); |
| |
| Not everything can be converted in this way, especially lists and |
| ranges. |
| |
| |
| IMPLEMENTATION |
| |
| Pad Capabilities (caps) are mathematical sets that represent all the |
| possible stream types that a pad can use. These general sets are |
| represented by unions of simpler sets known as caps structures. Each |
| caps structure has a media type (e.g., "audio/mpeg") and a number of |
| properties. Each property has a name and a GValue. In normal |
| circumstances, the GValue will have the types int, boolean, string, |
| fourcc, and double. Simple sets are constructed by using GValues |
| that are lists of other GValues, or the special types that represent |
| int ranges and double ranges. |
| |
| A "fixed" caps represents exactly one media format. This means that |
| the caps is a union of exactly one caps structure, and each property |
| in the caps structure is a simple type, i.e., no ranges or lists. |
| |
| There are two special caps values, "ANY" which represents the union |
| of all stream types, and "EMPTY", which represents the set of no |
| stream types. The ANY caps is often used on generic elements that |
| handle any type of data (e.g., filesrc and filesink). The EMPTY |
| caps is the return value of gst_caps_intersect(), when the two |
| given caps do not intersect. In many cases, using EMPTY is invalid. |
| |
| |
| CAPS NEGOTIATION |
| |
| Elements provide information to the core about what stream formats |
| they understand in four ways: the caps in the pad templates, the |
| caps returned by a pad's getcaps function, accepting/denying |
| a given caps in the pad link function, and a new fixate function. |
| |
| The pad template caps should be the union of caps a pad supports |
| in any potential situation. Simultaneously, these caps should be |
| as specific as possible, since it is used to decide which elements |
| to attempt for autoplugging, without having to load the element. |
| The pad template caps are generally detemined at compile time, but |
| might be actually computed at run-time from other information. |
| |
| The getcaps() function returns the caps supported by a given pad, |
| in the context of the element's state, its link to other elements, |
| and the devices or files it has opened. These caps must be a |
| subset of the pad template caps. In the NULL state with no links, |
| the getcaps function should ideally return the same caps as the |
| pad template. In rare circumstances, an object property can affect |
| the caps returned by getcaps, but this is discouraged. For most |
| filters, the caps returned by getcaps is directly affected by the |
| allowed caps on other pads. For demuxers and decoders, the caps |
| returned by the srcpad's getcaps function is directly related to |
| the stream data. Again, getcaps should return the most specific |
| caps it reasonably can, since this helps with autoplugging. |
| |
| The pad link function is the last step in negotiating caps. The |
| core calls the pad link function with a fixed caps, meaning that |
| the stream format is precisely defined, with the caps having one |
| structure, with no fields that are ranges or lists. |
| |
| There is also a new pad function "fixate", which is used to help |
| choose a fixed caps from a non-fixed caps. This is called in |
| situations where normal negotiation cannot decide on a fixed caps. |
| You should almost never implement a fixate function, please ask |
| me if it is appropriate for your case. Fixate functions are called |
| iteratively on the pads until a fixed caps is found. Fixate functions |
| are called with a const caps, and should return a caps that is a |
| strict subset of the given caps. That is, the function should |
| create a caps that is "more fixed" than previously, but does not |
| have to return fixed caps. If the fixate function can't provide |
| more fixed caps, it should return NULL. |
| |
| |
| |
| Checklist for getcaps: |
| |
| - The getcaps function prototype no longer has the caps parameter. |
| Remove it. |
| |
| - The returned caps is owned by the caller. Make sure you don't |
| keep a pointer to the caps. |
| |
| - Make sure that the getcaps function can be called safely in each |
| element state (NULL, READY, PAUSED, PLAYING), and for any element |
| configuration (properties, links, devices/files opened or not, |
| error state, etc.) |
| |
| - Make sure that the returned caps do not depend on the caps that |
| indicate the stream type that the pad is currently using. |
| |
| Checklist for pad_link: |
| |
| - The pad link function prototypes uses a const GstCaps *. |
| |
| - Pad link functions are called with fixed caps. There's no need |
| to check for this. This means that you can assume that the caps |
| is not ANY or EMPTY, and that there is exactly one structure in |
| the caps, and that all the fields in the structure are fixed. |
| |
| - Pad link functions are called with caps that are a subset of the |
| most recent return value of the pad's getcaps function. Generally, |
| the getcaps function was called immediately prior to calling the |
| src_link function. For 0.8, you can assume that nothing has changed |
| in your element that would cause a change to the return value of |
| getcaps. |
| |
| - the return value GST_PAD_LINK_OK should be used when the caps are |
| acceptable, and you've extracted all the necessary information from |
| the caps and set the element's internal state appropriately. |
| |
| - the return value GST_PAD_LINK_REFUSED should be used when the caps |
| are unacceptable for whatever reason. |
| |
| - the return value GST_PAD_LINK_DELAYED should be used when the |
| element is in a state where it can't determine whether the caps |
| are acceptable or not. This is often used if the element needs |
| to open a device or process data before determining acceptable |
| caps. |
| |
| - the pad_link function must not call gst_caps_try_set_caps() on |
| the pad that was specified as a parameter. |
| |
| - the pad_link function may (and often should) call |
| gst_caps_try_set_caps() on pads that are not specified as the |
| pad parameter. |
| |
| Checklist for fixate: |
| |
| - Make sure you actually should be using a fixate function. Fixate |
| functions are reasonable for non-fixed primary sources, such as |
| videotestsrc, v4lsrc, and osssrc. |
| |
| - The user_data parameter is mainly used for user-provided fixate |
| function. It should be ignored in element fixate functions. |
| |
| |
| |
| |