2 Some notes on pad negotiation
5 A "pad link" is a connection between two pads. It can be in one of
6 two states, "negotiated" or "not negotiated". Pad links are created
9 A "pad link" is created when two pads are linked using gst_pad_link().
10 When initially created, the link only specifies a src pad, a sink pad,
11 and optionally a filter caps provided by the application.
13 In order to pass data through a link, the peer pads must decide on
14 what data format to use. This is called negotiation. Pads
15 describe acceptable data formats by using a combination of pad
16 template caps and (optionally) a pad->getcaps function.
19 Negotiation can happen in one of two forms, directed or undirected.
20 Directed negotiation happens when one element has decided (usually
21 during negotiation on another pad) to ask for a specific format on
22 a pad. This happens when a pad calls gst_pad_try_set_caps().
23 Undirected negotiation happens when the core decides to negotiate
24 a link, either due to a state change or a specific application
27 Steps in undirected negotiation (core view):
29 - core checks that both pad's parent elements are in the READY or
32 - core calls gst_pad_get_caps() on each pad, intersects the two caps,
33 and intersects again with the filter caps. If the intersection is
34 empty, then the pads have no formats in common, and the link fails.
36 - If the intersection caps is not fixed, there are multiple possible
37 formats that the link could use. If this is the case, fixate
38 functions are called until the caps are fixed. The fixate functions
39 are called by priority -- src application fixate function, sink
40 application fixate function, src and sink fixate functions, and
41 the default core fixate function. The application fixate functions
42 are implemented by the "fixate" signal on each pad. The core
43 loops through the fixate functions until a fixed caps is decided
46 - Each pad may have a pad_link function, which is called with the
47 fixed caps. The pad_link function has the option of accepting,
48 rejecting, or delaying the negotiation.
50 - If both pads accept the caps, the link is then negotiated.
52 Steps in directed negotiation (gst_pad_try_set_caps):
54 - the originator is the pad that gst_pad_try_set_caps() is called
57 - the elements owning both pads are assumed to be in a non-NULL state
59 - the caps argument of try_set_caps() must be fixed.
61 - gst_pad_get_caps() is called on the peer pad, and intersected with
62 the originating pad's pad template caps and the filter caps. The
63 caps argument is checked to be a subset of the intersection. (It's
64 important that this intersection uses the pad _template_ caps.)
66 - Fixate functions don't need to be called, since the caps are
69 - The peer's pad_link function is called.
71 - If the peer's pad_link function accepts the caps, the link is then
74 - If the peer's pad_link function refuses the caps, and the link had
75 already been negotiated, the peer's pad_link function is called
76 with the caps of the old negotiation.
78 - Note: the originator's pad_link function is _not_ called. The
79 originator must take appropriate alternative steps.
82 Notes about renegotiation:
84 - same as negotiation. Note that get_caps() functions should always
85 ignore the currently negotiated caps of a link.
87 - if renegotiation fails, the previous negotiation is still in effect.
88 If the renegotiation fails in the last pad_link step, the pad_link
89 functions are called with the previously negotiated caps.
92 Notes for sources and sinks:
94 - sources and sinks that talk to hardware may not be able to fully
95 describe their available formats, and thus need to rely on pad_link
96 functions to test a particular format. FIXME: currently, the core
97 completely fails negotiation if a pad_link function refuses a caps,
98 instead of attempting with an alternate caps.
100 Example: Assume osssink advertises rate=(int)[8000,48000], but
101 the device cannot actually handle rate=44100 (unknown to osssink).
102 Assume that the pad_link function is called with rate=44100 --
103 ideally, the pad_link function should return GST_PAD_LINK_DELAYED,
104 and future calls to getcaps should return {[8000,44099],[44101,
105 48000]}. I don't know how to make this easy and/or work well.
108 Notes for decoders/demuxers:
110 - Decoders will typically negotiate a sink pad, receive some data,
111 determine the output format, and call try_set_caps() with the given
112 format. If the output format is non-fixed, gst_pad_renegotiate()
113 may be used instead, in order to have the fixate functions choose
114 the optimal format. Note that this requires communication so that
115 the pad's getcaps function returns the correct caps.
117 Notes for converters:
119 - Converters change one or more properties of the format of a data
120 stream. A typical converter's getcaps function will call
121 gst_pad_get_allowed_caps() for the opposite pad in the element,
122 change one or more fields in the caps, and return the result.
126 - call gst_pad_get_allowed_caps() on the other pad in the element
128 - for each possible format ("A") in the allowed caps, determine all
129 the formats ("B") that your converter could convert the original
130 format (A) to. The union of all these formats (all the B's) is
131 the caps that should be returned. (This is how to do it
132 _theoretically_, but an optimal implementation will probably be
134 For example, a simple way to do this for an element that can convert
135 a given field of the caps is to remove the field(s) from the structure,
136 then intersect with the pad template.
138 - As an example, videoscale can convert any sized video to any other
139 sized video. Its getcaps function iterates over each structure in
140 the caps, and replaces the width and height with the range
145 - the "otherpad" is the opposite pad in the element.
147 - extract fields from the caps that are relevant for your converter
148 handling the format. Store these in _local_ variables. (E.g,
149 things like video size, sample rate, etc.)
151 - If it's possible to pass buffers through without modifying them
152 (passthrough), you should call gst_try_set_caps() with the caps
153 that was specified as the parameter to the pad_link function. If
154 this is successful, save the local variables to the element
155 structure, perform whatever other setup is necessary for your
156 element, and return GST_PAD_LINK_OK.
158 - Otherwise, you're not using passthrough, and may need to
159 change the caps on the otherpad to match the given format.
161 - If the otherpad is not negotiated (!gst_pad_is_negotiated()),
162 you shouldn't attempt to set a format on it. It will eventually
163 be negotiated. Save the local variables to the element structure,
164 perform whatever other setup is necessary, and return
167 - At this point, the other pad is already negotiated, but won't
168 accept the passthrough format, so you should combine the existing
169 negotiated caps on the otherpad and the caps that was the pad link
170 argument. This can either be done using existing information in the
171 element that was saved during a previous pad_link call, or you can
172 get the information from the negotiated caps
173 (gst_pad_get_negotiated_caps()).
175 As an example, consider the videoscale element. Assume that
176 videoscale.src has already negotiated "video/x-raw-yuv,
177 format=(fourcc)I420, width=320, height=240", and that the sink
178 pad's link function is called with "video/x-raw-yuv,
179 format=(fourcc)YUY2, width=640, height=480". Since it's the
180 videoscale element, we can have different width and height
181 fields on the pads, but the format must be the same. So we'll
182 use the existing negotiated size (640x480), and the new format,
183 and call gst_pad_try_set_caps() with "video/x-raw-yuv,
184 format=(fourcc)I420, width=640, height=480".
186 This may seem overkill, but most of the time, you'll end up
187 calling try_set_caps() with the same caps that are currently
188 negotiated -- try_set_caps() just returns GST_PAD_LINK_OK in
191 - If gst_pad_try_set_caps() returns GST_PAD_LINK_OK, save the
192 local variables to the element structure. In any case, return
193 the return value of gst_pad_try_set_caps().
198 - Filters can almost always use gst_pad_proxy_getcaps() as the
199 getcaps function. This just returns gst_pad_get_allowed_caps()
202 - You may be able to use gst_pad_proxy_pad_link() as the pad link
203 function, but only if you don't need to extract parameters from
207 Notes for encoders/muxers:
209 - Encoders and muxers should roughly work like converters. Many
210 converters are symmetric; encoders and muxers obvious are not,
211 thus it may make the code clearer to have separate src and sink
212 getcaps and pad_link functions.
214 - Encoders and muxers should handle multiple negotiations until
215 the first buffer has been passed. After this point, it's unlikely
216 that additional negotiations will happen in well-constructed
217 pipelines, but it may be wise to "lock" the caps after the
218 muxer has committed to a format. (FIXME: it's still unclear to
219 me when the caps should get "unlocked". Obviously at EOS or
220 PAUSED->READY transitions. Any others?)
222 - Locking caps can be done by adding (near the top) of the getcaps
225 if (my_element->lock_caps) {
226 return gst_pad_get_negotiated_caps (pad);
232 - There's a hack in the core to make the code for decoder elements
233 a lot simpler. This hack can be used only for src pads of elements
234 that get their srcpad capabilities directly from the data stream,
235 i.e., decoders, demuxers, and typefind. This hack overrides the
236 pad's getcaps() and pad_link() function, so that they work correctly
237 in all decoder states.
239 - To enable this hack on a pad, call gst_pad_use_explicit_caps().
241 - To indicate that a decoder has found the format of the stream, call
242 gst_pad_set_explicit_caps(pad,caps) with the caps of the stream.
243 This caps must be fixed.
245 - To indicate that a decoder has lost the format of the stream, i.e.,
246 there's been a NEW_MEDIA event, call gst_pad_set_explicit_caps(pad,
249 - If the explicit caps are set, the getcaps function will return that
250 caps, and the pad_link function will return GST_PAD_LINK_OK. If
251 the explicit caps are not set, the getcaps function returns the pad
252 template caps, and the pad_link function returns GST_PAD_LINK_DELAYED.
258 - negotiation can happen at any time
260 - negotiation can happen multiple times/often happens multiple times
262 - initial negotiation can lead to strange caps
264 - directed negotiation can happen in either direction (src to sink or
267 - Other considerations ignored, every pad should have a getcaps function.
269 - If a pad's getcaps function returns the same caps in every
270 circumstance, the getcaps function can be omitted.
272 - If you use gst_pad_use_explicit_caps(), the getcaps function must
275 - fixate functions are a method for applications to exert influence
276 on how a format is chosen from a caps. It's also used as a hack to
277 allow elements to do the same. Element fixate functions are _not_
278 intended to give good results for applications -- they're intended
279 to give non-disgusting results in gst-launch. Don't attempt to
280 make them do more than they're capable of.
282 - Fixate functions should not be implemented on anything except source