| SOME OF THE FIRST IDEAS, PRETTY OUTDATED | |
| ---------------------------------------- | |
| During the course of a discussion on IRC, it turned out | |
| that there are many possible ways to handle the capabilities. | |
| A capability is basically a set of properties attached to a | |
| mimetype in order to more closely describe the mimetype. | |
| Capabilities are supposed to be attached to pads so that the | |
| autoplugging algorithm has more specific information to connect | |
| compatible pads. | |
| We present 3 possible implementation for the capabilities. we need | |
| to pick one of them. | |
| 1. static capabilities | |
| ---------------------- | |
| When an element is created, it creates its pads like: | |
| mpg123->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); | |
| gst_element_add_pad (GST_ELEMENT (mpg123), mpg123->sinkpad); | |
| mpg123->srcpad = gst_pad_new ("src", GST_PAD_SRC); | |
| gst_element_add_pad (GST_ELEMENT (mpg123), mpg123->srcpad); | |
| In the static capabilities case, it will attach a GstCaps* structure | |
| to the pad. The GstCaps structure in the above example might look like: | |
| static GstCapsFactory mpg123_sink_caps = { | |
| "audio/mp3", | |
| "layer", GST_CAPS_INT_RANGE (1, 3), | |
| "bitrate", GST_CAPS_INT_RANGE (8, 320), | |
| NULL | |
| }; | |
| with | |
| mpg123sinkcaps = gst_caps_register (mpg123_sink_caps); | |
| the factory can be converted into a GstCaps* structure. The | |
| GstCaps* structure is attached to the pad with: | |
| gst_pad_add_caps (mpg123->sinkpad, mpg123sinkcaps); | |
| The GstElement would then have a sinkpad with the given | |
| mimetype (audio/mp3) and with the capabilitities of accepting | |
| mpeg layer 1 to 3 and a bitrate from 8 up to 320 Kbps. | |
| Likewise, the src pad could be set up in the same way. An | |
| example capability factory could look like: | |
| static GstCapsFactory mpg123_src_caps = { | |
| "audio/raw", | |
| "format", GST_CAPS_BITFIELD (...), | |
| "depth", GST_CAPS_INT (16), | |
| "rate", GST_CAPS_INT_RANGE (4000, 96000), | |
| "channels", GST_CAPS_INT_RANGE (1, 2), | |
| NULL | |
| }; | |
| All GstElements would present their pads with the appropriate | |
| capabilities structure. | |
| The autoplugger would then proceed (once the source media type | |
| is known with a typefind function) in finding all the elements | |
| with compatible pads and connecting them into a pipeline. | |
| All elements of the complete pipeline could then be constructed | |
| with one single pass. No new elements should be added to the | |
| pipeline because we can figure out all the possibilities using the | |
| pad capabilities. | |
| We call this the static case because the capabilities of the pads | |
| are supposed to stay the same after creating the element. | |
| While the ability to completly setup the pipeline before actually | |
| starting playback is an advantage regarding performance, one obvious | |
| problem with this setup is that the static case may be too static in | |
| some cases. We can illustrate this with the following setup: | |
| ----------) (------------ | |
| mpg123 ! ! audiosink | |
| src sink | |
| ! ! | |
| ----------) (------------ | |
| The mpg123 element has its src capabilities set up as mpg123_src_caps | |
| in the above example. | |
| The audio renderer has its capabilities set up with the following | |
| factory: | |
| static GstCapsFactory audio_sink_caps = { | |
| "audio/raw", | |
| "format", GST_CAPS_BITFIELD (...), | |
| "depth", GST_CAPS_INT (16), | |
| "rate", GST_CAPS_INT_RANGE (22000, 44000), | |
| "channels", GST_CAPS_INT_RANGE (1, 2), | |
| NULL | |
| }; | |
| The static autoplugger has to be carefull when connecting the mpg123 | |
| element with the audiosink because it is theoretically possible that | |
| the mpg123 element outputs raw audio with a rate that cannot be | |
| handled by the audiosink (ex. 4000KHz). In the absence of another | |
| audiosink with more capabilities, the autoplugging of this simple | |
| pipeline will not be possible and would fail. | |
| the autoplugging algorithm would probably select another element to | |
| insert between the mpg123 element and the audiosink in order to handle | |
| the (uncommon) case of a rate conversion (audioscaler). | |
| It is clear that this static setup might even fail or work suboptimal | |
| for even the common case and should therefore be considered as too | |
| restrictive. | |
| 2. dynamic capabilities | |
| ----------------------- | |
| The idea of dynamic capabilities is that the capabilities are not set | |
| at element create time but rather while the pipeline is running. | |
| An element would still list its mime type using: | |
| gst_pad_add_type_id(mpg123->sinkpad, mp3type); | |
| The idea would then be that a rough draft of the pipeline would be | |
| built afer the media type of the stream has been detected with the | |
| typefind functions. The rough draft would consist of laying out a | |
| global plan to reach the renderer(s). this plan would basically list | |
| the set of conversions that have to be performed. (mime-type to | |
| mime-type conversion). | |
| Elements that accept the src mime-type are tried by giving it a buffer. | |
| If the element accepts the buffer, it will set its capabilities for | |
| both the sink pad and the src pad. At that time other elements can be | |
| tried and added to the src pad, until we reach the renderer. As usual | |
| one has to be carefull to add just the minimum amount of elements to | |
| reach the renderer. The global plan will help with that. | |
| Since we basically do not use the capabilities of the sink pad one has | |
| to question the need for sink pad capabilities in the first place. | |
| We might also have a hard time trying different elements until we find | |
| a compatible one that does not cause a dead end at some point. | |
| 3. combined setup | |
| ----------------- | |
| This combined setup will minimise the effort needed to try different | |
| elements encountered by option 2 while still allowing a more dynamic | |
| setup based on the actual media stream we are handling. | |
| The combined setup will list/add the sink capabilities at create time. | |
| It will only set the mime-type of its src pads. | |
| As with option2, a global plan will be built. At runtime the src pads | |
| will actually specify the capabilities they need for any element that | |
| wants to be connected to its source pads. | |
| In this case we specify the capabilities for all the sink pads of an | |
| element at create time. The capabilities of the src pads would only | |
| become available when data has been processed by the element. | |
| The autoplugger would then be able to choose an element that can handle | |
| the capability listed by the src pad. | |
| in our previous example: | |
| ----------) (------------ | |
| mpg123 ! ! audiosink | |
| src sink | |
| ! ! | |
| ----------) (------------ | |
| the audiosink element would specify its sink pad capabilities at create | |
| time, while the mpg123 elements src pad would not yet have any capabilities | |
| set. | |
| When data is handled by the mpg123 element, a capability would be added to | |
| the mpg123 src pad. This capability might be: | |
| static GstCapsFactory mpg123_src_caps = { | |
| "audio/raw", | |
| "format", GST_CAPS_INT (S16), | |
| "depth", GST_CAPS_INT (16), | |
| "rate", GST_CAPS_INT (44000), | |
| "channels", GST_CAPS_INT (2), | |
| NULL | |
| }; | |
| This capability would be compatible with the audiosinks sinkpad capabilities | |
| and the autoplugger would therefore be able to connect the two elements. | |
| While allowing a more flexible setup with option3, compared to option1, we | |
| introduce a slightly higher overhead when we need to dynamically connect | |
| elements. This overhead will not be as big as option2 because we don't | |
| have to 'try' elements. | |
| so: | |
| src caps: added at runtime to list the caps needed for an element that | |
| wants to connect to this pad. | |
| sink caps: the (static) capabilities that this sinkpad has. | |