| 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. | |