[21447] | 1 | <chapter id="chapter-elements" xreflabel="Elements"> |
---|
| 2 | <title>Elements</title> |
---|
| 3 | <para> |
---|
| 4 | The most important object in &GStreamer; for the application programmer |
---|
| 5 | is the <ulink type="http" |
---|
| 6 | url="../../gstreamer/html/GstElement.html"><classname>GstElement</classname></ulink> |
---|
| 7 | object. An element is the basic building block for a media pipeline. All |
---|
| 8 | the different high-level components you will use are derived from |
---|
| 9 | <classname>GstElement</classname>. Every decoder, encoder, demuxer, video |
---|
| 10 | or audio output is in fact a <classname>GstElement</classname> |
---|
| 11 | </para> |
---|
| 12 | |
---|
| 13 | <sect1 id="section-elements-design" xreflabel="What are elements?"> |
---|
| 14 | <title>What are elements?</title> |
---|
| 15 | <para> |
---|
| 16 | For the application programmer, elements are best visualized as black |
---|
| 17 | boxes. On the one end, you might put something in, the element does |
---|
| 18 | something with it and something else comes out at the other side. For |
---|
| 19 | a decoder element, ifor example, you'd put in encoded data, and the |
---|
| 20 | element would output decoded data. In the next chapter (see <xref |
---|
| 21 | linkend="chapter-pads"/>), you will learn more about data input and |
---|
| 22 | output in elements, and how you can set that up in your application. |
---|
| 23 | </para> |
---|
| 24 | |
---|
| 25 | <sect2 id="section-elements-src"> |
---|
| 26 | <title>Source elements</title> |
---|
| 27 | <para> |
---|
| 28 | Source elements generate data for use by a pipeline, for example |
---|
| 29 | reading from disk or from a sound card. <xref |
---|
| 30 | linkend="section-element-srcimg"/> shows how we will visualise |
---|
| 31 | a source element. We always draw a source pad to the right of |
---|
| 32 | the element. |
---|
| 33 | </para> |
---|
| 34 | <figure float="1" id="section-element-srcimg"> |
---|
| 35 | <title>Visualisation of a source element</title> |
---|
| 36 | <mediaobject> |
---|
| 37 | <imageobject> |
---|
| 38 | <imagedata fileref="images/src-element.ℑ" |
---|
| 39 | format="&IMAGE;"/> |
---|
| 40 | </imageobject> |
---|
| 41 | </mediaobject> |
---|
| 42 | </figure> |
---|
| 43 | <para> |
---|
| 44 | Source elements do not accept data, they only generate data. You can |
---|
| 45 | see this in the figure because it only has a source pad (on the |
---|
| 46 | right). A source pad can only generate data. |
---|
| 47 | </para> |
---|
| 48 | </sect2> |
---|
| 49 | |
---|
| 50 | <sect2 id="section-elements-filter"> |
---|
| 51 | <title>Filters, convertors, demuxers, muxers and codecs</title> |
---|
| 52 | <para> |
---|
| 53 | Filters and filter-like elements have both input and outputs pads. |
---|
| 54 | They operate on data that they receive on their input (sink) pads, |
---|
| 55 | and will provide data on their output (source) pads. Examples of |
---|
| 56 | such elements are a volume element (filter), a video scaler |
---|
| 57 | (convertor), an Ogg demuxer or a Vorbis decoder. |
---|
| 58 | </para> |
---|
| 59 | <para> |
---|
| 60 | Filter-like elements can have any number of source or sink pads. A |
---|
| 61 | video demuxer, for example, would have one sink pad and several |
---|
| 62 | (1-N) source pads, one for each elementary stream contained in the |
---|
| 63 | container format. Decoders, on the other hand, will only have one |
---|
| 64 | source and sink pads. |
---|
| 65 | </para> |
---|
| 66 | <figure float="1" id="section-element-filterimg"> |
---|
| 67 | <title>Visualisation of a filter element</title> |
---|
| 68 | <mediaobject> |
---|
| 69 | <imageobject> |
---|
| 70 | <imagedata fileref="images/filter-element.ℑ" |
---|
| 71 | format="&IMAGE;"/> |
---|
| 72 | </imageobject> |
---|
| 73 | </mediaobject> |
---|
| 74 | </figure> |
---|
| 75 | <para> |
---|
| 76 | <xref linkend="section-element-filterimg"/> shows how we will |
---|
| 77 | visualise a filter-like element. This specific element has one source |
---|
| 78 | and one sink element. Sink pads, receiving input data, are depicted |
---|
| 79 | at the left of the element; source pads are still on the right. |
---|
| 80 | </para> |
---|
| 81 | <figure float="1" id="section-element-multifilterimg"> |
---|
| 82 | <title>Visualisation of a filter element with |
---|
| 83 | more than one output pad</title> |
---|
| 84 | <mediaobject> |
---|
| 85 | <imageobject> |
---|
| 86 | <imagedata fileref="images/filter-element-multi.ℑ" |
---|
| 87 | format="&IMAGE;" /> |
---|
| 88 | </imageobject> |
---|
| 89 | </mediaobject> |
---|
| 90 | </figure> |
---|
| 91 | <para> |
---|
| 92 | <xref linkend="section-element-multifilterimg"/> shows another |
---|
| 93 | filter-like element, this one having more than one output (source) |
---|
| 94 | pad. An example of one such element could, for example, be an Ogg |
---|
| 95 | demuxer for an Ogg stream containing both audio and video. One |
---|
| 96 | source pad will contain the elementary video stream, another will |
---|
| 97 | contain the elementary audio stream. Demuxers will generally fire |
---|
| 98 | signals when a new pad is created. The application programmer can |
---|
| 99 | then handle the new elementary stream in the signal handler. |
---|
| 100 | </para> |
---|
| 101 | </sect2> |
---|
| 102 | |
---|
| 103 | <sect2 id="section-elements-sink"> |
---|
| 104 | <title>Sink elements</title> |
---|
| 105 | <para> |
---|
| 106 | Sink elements are end points in a media pipeline. They accept |
---|
| 107 | data but do not produce anything. Disk writing, soundcard playback, |
---|
| 108 | and video output would all be implemented by sink elements. |
---|
| 109 | <xref linkend="section-element-sinkimg"/> shows a sink element. |
---|
| 110 | </para> |
---|
| 111 | <figure float="1" id="section-element-sinkimg"> |
---|
| 112 | <title>Visualisation of a sink element</title> |
---|
| 113 | <mediaobject> |
---|
| 114 | <imageobject> |
---|
| 115 | <imagedata fileref="images/sink-element.ℑ" |
---|
| 116 | format="&IMAGE;" /> |
---|
| 117 | </imageobject> |
---|
| 118 | </mediaobject> |
---|
| 119 | </figure> |
---|
| 120 | </sect2> |
---|
| 121 | </sect1> |
---|
| 122 | |
---|
| 123 | <sect1 id="section-elements-create"> |
---|
| 124 | <title>Creating a <classname>GstElement</classname></title> |
---|
| 125 | <para> |
---|
| 126 | The simplest way to create an element is to use <ulink type="http" |
---|
| 127 | url="&URLAPI;GstElementFactory.html#gst-element-factory-make"><function>gst_element_factory_make |
---|
| 128 | ()</function></ulink>. This function takes a factory name and an |
---|
| 129 | element name for the newly created element. The name of the element |
---|
| 130 | is something you can use later on to look up the element in a bin, |
---|
| 131 | for example. The name will also be used in debug output. You can |
---|
| 132 | pass <symbol>NULL</symbol> as the name argument to get a unique, |
---|
| 133 | default name. |
---|
| 134 | </para> |
---|
| 135 | <para> |
---|
| 136 | When you don't need the element anymore, you need to unref it using |
---|
| 137 | <ulink type="http" |
---|
| 138 | url="&URLAPI;GstObject.html#gst-object-unref"><function>gst_object_unref |
---|
| 139 | ()</function></ulink>. This decreases the reference count for the |
---|
| 140 | element by 1. An element has a refcount of 1 when it gets created. |
---|
| 141 | An element gets destroyed completely when the refcount is decreased |
---|
| 142 | to 0. |
---|
| 143 | </para> |
---|
| 144 | <para> |
---|
| 145 | The following example &EXAFOOT; shows how to create an element named |
---|
| 146 | <emphasis>source</emphasis> from the element factory named |
---|
| 147 | <emphasis>fakesrc</emphasis>. It checks if the creation succeeded. |
---|
| 148 | After checking, it unrefs the element. |
---|
| 149 | </para> |
---|
| 150 | <programlisting><!-- example-begin elementmake.c --><![CDATA[ |
---|
| 151 | #include <gst/gst.h> |
---|
| 152 | |
---|
| 153 | int |
---|
| 154 | main (int argc, |
---|
| 155 | char *argv[]) |
---|
| 156 | { |
---|
| 157 | GstElement *element; |
---|
| 158 | |
---|
| 159 | /* init GStreamer */ |
---|
| 160 | gst_init (&argc, &argv); |
---|
| 161 | |
---|
| 162 | /* create element */ |
---|
| 163 | element = gst_element_factory_make ("fakesrc", "source"); |
---|
| 164 | if (!element) { |
---|
| 165 | g_print ("Failed to create element of type 'fakesrc'\n"); |
---|
| 166 | return -1; |
---|
| 167 | } |
---|
| 168 | |
---|
| 169 | gst_object_unref (GST_OBJECT (element)); |
---|
| 170 | |
---|
| 171 | return 0; |
---|
| 172 | } |
---|
| 173 | ]]><!-- example-end elementmake.c --></programlisting> |
---|
| 174 | <para> |
---|
| 175 | <function>gst_element_factory_make</function> is actually a shorthand |
---|
| 176 | for a combination of two functions. A <ulink type="http" |
---|
| 177 | url="&URLAPI;GstElement.html"><classname>GstElement</classname></ulink> |
---|
| 178 | object is created from a factory. To create the element, you have to |
---|
| 179 | get access to a <ulink type="http" |
---|
| 180 | url="&URLAPI;GstElementFactory.html"><classname>GstElementFactory</classname></ulink> |
---|
| 181 | object using a unique factory name. This is done with <ulink type="http" |
---|
| 182 | url="&URLAPI;GstElementFactory.html#gst-element-factory-find"><function>gst_element_factory_find |
---|
| 183 | ()</function></ulink>. |
---|
| 184 | </para> |
---|
| 185 | <para> |
---|
| 186 | The following code fragment is used to get a factory that can be used |
---|
| 187 | to create the <emphasis>fakesrc</emphasis> element, a fake data source. |
---|
| 188 | The function <ulink type="http" |
---|
| 189 | url="&URLAPI;GstElementFactory.html#gst-element-factory-create"><function>gst_element_factory_create |
---|
| 190 | ()</function></ulink> will use the element factory to create an |
---|
| 191 | element with the given name. |
---|
| 192 | </para> |
---|
| 193 | <programlisting><!-- example-begin elementcreate.c --><![CDATA[ |
---|
| 194 | #include <gst/gst.h> |
---|
| 195 | |
---|
| 196 | int |
---|
| 197 | main (int argc, |
---|
| 198 | char *argv[]) |
---|
| 199 | { |
---|
| 200 | GstElementFactory *factory; |
---|
| 201 | GstElement * element; |
---|
| 202 | |
---|
| 203 | /* init GStreamer */ |
---|
| 204 | gst_init (&argc, &argv); |
---|
| 205 | |
---|
| 206 | /* create element, method #2 */ |
---|
| 207 | factory = gst_element_factory_find ("fakesrc"); |
---|
| 208 | if (!factory) { |
---|
| 209 | g_print ("Failed to find factory of type 'fakesrc'\n"); |
---|
| 210 | return -1; |
---|
| 211 | } |
---|
| 212 | element = gst_element_factory_create (factory, "source"); |
---|
| 213 | if (!element) { |
---|
| 214 | g_print ("Failed to create element, even though its factory exists!\n"); |
---|
| 215 | return -1; |
---|
| 216 | } |
---|
| 217 | |
---|
| 218 | gst_object_unref (GST_OBJECT (element)); |
---|
| 219 | |
---|
| 220 | return 0; |
---|
| 221 | } |
---|
| 222 | ]]><!-- example-end elementcreate.c --></programlisting> |
---|
| 223 | </sect1> |
---|
| 224 | |
---|
| 225 | <sect1 id="section-elements-properties"> |
---|
| 226 | <title>Using an element as a <classname>GObject</classname></title> |
---|
| 227 | <para> |
---|
| 228 | A <ulink type="http" |
---|
| 229 | url="&URLAPI;GstElement.html"><classname>GstElement</classname></ulink> |
---|
| 230 | can have several properties which are implemented using standard |
---|
| 231 | <classname>GObject</classname> properties. The usual |
---|
| 232 | <classname>GObject</classname> methods to query, set and get |
---|
| 233 | property values and <classname>GParamSpecs</classname> are |
---|
| 234 | therefore supported. |
---|
| 235 | </para> |
---|
| 236 | <para> |
---|
| 237 | Every <classname>GstElement</classname> inherits at least one |
---|
| 238 | property from its parent <classname>GstObject</classname>: the |
---|
| 239 | "name" property. This is the name you provide to the functions |
---|
| 240 | <function>gst_element_factory_make ()</function> or |
---|
| 241 | <function>gst_element_factory_create ()</function>. You can get |
---|
| 242 | and set this property using the functions |
---|
| 243 | <function>gst_object_set_name</function> and |
---|
| 244 | <function>gst_object_get_name</function> or use the |
---|
| 245 | <classname>GObject</classname> property mechanism as shown below. |
---|
| 246 | </para> |
---|
| 247 | <programlisting><!-- example-begin elementget.c --><![CDATA[ |
---|
| 248 | #include <gst/gst.h> |
---|
| 249 | |
---|
| 250 | int |
---|
| 251 | main (int argc, |
---|
| 252 | char *argv[]) |
---|
| 253 | { |
---|
| 254 | GstElement *element; |
---|
| 255 | const gchar *name; |
---|
| 256 | |
---|
| 257 | /* init GStreamer */ |
---|
| 258 | gst_init (&argc, &argv); |
---|
| 259 | |
---|
| 260 | /* create element */ |
---|
| 261 | element = gst_element_factory_make ("fakesrc", "source"); |
---|
| 262 | |
---|
| 263 | /* get name */ |
---|
| 264 | g_object_get (G_OBJECT (element), "name", &name, NULL); |
---|
| 265 | g_print ("The name of the element is '%s'.\n", name); |
---|
| 266 | |
---|
| 267 | gst_object_unref (GST_OBJECT (element)); |
---|
| 268 | |
---|
| 269 | return 0; |
---|
| 270 | } |
---|
| 271 | ]]><!-- example-end elementget.c --></programlisting> |
---|
| 272 | <para> |
---|
| 273 | Most plugins provide additional properties to provide more information |
---|
| 274 | about their configuration or to configure the element. |
---|
| 275 | <command>gst-inspect</command> is a useful tool to query the properties |
---|
| 276 | of a particular element, it will also use property introspection to give |
---|
| 277 | a short explanation about the function of the property and about the |
---|
| 278 | parameter types and ranges it supports. See the appendix for details |
---|
| 279 | about <command>gst-inspect</command>. |
---|
| 280 | </para> |
---|
| 281 | <para> |
---|
| 282 | For more information about <classname>GObject</classname> |
---|
| 283 | properties we recommend you read the <ulink |
---|
| 284 | url="http://developer.gnome.org/doc/API/2.0/gobject/index.html" |
---|
| 285 | type="http">GObject manual</ulink> and an introduction to <ulink |
---|
| 286 | url="http://le-hacker.org/papers/gobject/index.html" type="http">The |
---|
| 287 | Glib Object system</ulink>. |
---|
| 288 | </para> |
---|
| 289 | <para> |
---|
| 290 | A <ulink type="http" url="&URLAPI;gstreamer/html/GstElementFactory.html"> |
---|
| 291 | <classname>GstElement</classname></ulink> also provides various |
---|
| 292 | <classname>GObject</classname> signals that can be used as a flexible |
---|
| 293 | callback mechanism. Here, too, you can use <command>gst-inspect</command> |
---|
| 294 | to see which signals a specific elements supports. Together, signals |
---|
| 295 | and properties are the most basic way in which elements and |
---|
| 296 | applications interact. |
---|
| 297 | </para> |
---|
| 298 | </sect1> |
---|
| 299 | |
---|
| 300 | <sect1 id="section-elements-factories"> |
---|
| 301 | <title>More about element factories</title> |
---|
| 302 | <para> |
---|
| 303 | In the previous section, we briefly introduced the <ulink type="http" |
---|
| 304 | url="&URLAPI;GstElement.html"><classname>GstElementFactory</classname></ulink> |
---|
| 305 | object already as a way to create instances of an element. Element |
---|
| 306 | factories, however, are much more than just that. Element factories |
---|
| 307 | are the basic types retrieved from the &GStreamer; registry, they |
---|
| 308 | describe all plugins and elements that &GStreamer; can create. This |
---|
| 309 | means that element factories are useful for automated element |
---|
| 310 | instancing, such as what autopluggers do, and for creating lists |
---|
| 311 | of available elements, such as what pipeline editing applications |
---|
| 312 | (e.g. <ulink type="http" |
---|
| 313 | url="http://gstreamer.freedesktop.org/modules/gst-editor.html">&GStreamer; |
---|
| 314 | Editor</ulink>) do. |
---|
| 315 | </para> |
---|
| 316 | |
---|
| 317 | <sect2 id="section-elements-factories-details"> |
---|
| 318 | <title>Getting information about an element using a factory</title> |
---|
| 319 | <para> |
---|
| 320 | Tools like <command>gst-inspect</command> will provide some generic |
---|
| 321 | information about an element, such as the person that wrote the |
---|
| 322 | plugin, a descriptive name (and a shortname), a rank and a category. |
---|
| 323 | The category can be used to get the type of the element that can |
---|
| 324 | be created using this element factory. Examples of categories include |
---|
| 325 | <classname>Codec/Decoder/Video</classname> (video decoder), |
---|
| 326 | <classname>Codec/Encoder/Video</classname> (video encoder), |
---|
| 327 | <classname>Source/Video</classname> (a video generator), |
---|
| 328 | <classname>Sink/Video</classname> (a video output), and all these |
---|
| 329 | exist for audio as well, of course. Then, there's also |
---|
| 330 | <classname>Codec/Demuxer</classname> and |
---|
| 331 | <classname>Codec/Muxer</classname> and a whole lot more. |
---|
| 332 | <command>gst-inspect</command> will give a list of all factories, and |
---|
| 333 | <command>gst-inspect <factory-name></command> will list all |
---|
| 334 | of the above information, and a lot more. |
---|
| 335 | </para> |
---|
| 336 | <programlisting><!-- example-begin elementfactory.c --><![CDATA[ |
---|
| 337 | #include <gst/gst.h> |
---|
| 338 | |
---|
| 339 | int |
---|
| 340 | main (int argc, |
---|
| 341 | char *argv[]) |
---|
| 342 | { |
---|
| 343 | GstElementFactory *factory; |
---|
| 344 | |
---|
| 345 | /* init GStreamer */ |
---|
| 346 | gst_init (&argc, &argv); |
---|
| 347 | |
---|
| 348 | /* get factory */ |
---|
| 349 | factory = gst_element_factory_find ("sinesrc"); |
---|
| 350 | if (!factory) { |
---|
| 351 | g_print ("You don't have the 'sinesrc' element installed, go get it!\n"); |
---|
| 352 | return -1; |
---|
| 353 | } |
---|
| 354 | |
---|
| 355 | /* display information */ |
---|
| 356 | g_print ("The '%s' element is a member of the category %s.\n" |
---|
| 357 | "Description: %s\n", |
---|
| 358 | gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)), |
---|
| 359 | gst_element_factory_get_klass (factory), |
---|
| 360 | gst_element_factory_get_description (factory)); |
---|
| 361 | |
---|
| 362 | return 0; |
---|
| 363 | } |
---|
| 364 | ]]><!-- example-end elementfactory.c --></programlisting> |
---|
| 365 | <para> |
---|
| 366 | You can use <function>gst_registry_pool_feature_list (GST_TYPE_ELEMENT_FACTORY)</function> |
---|
| 367 | to get a list of all the element factories that &GStreamer; knows |
---|
| 368 | about. |
---|
| 369 | </para> |
---|
| 370 | </sect2> |
---|
| 371 | |
---|
| 372 | <sect2 id="section-elements-factories-padtemplates"> |
---|
| 373 | <title>Finding out what pads an element can contain</title> |
---|
| 374 | <para> |
---|
| 375 | Perhaps the most powerful feature of element factories is that |
---|
| 376 | they contain a full description of the pads that the element |
---|
| 377 | can generate, and the capabilities of those pads (in layman words: |
---|
| 378 | what types of media can stream over those pads), without actually |
---|
| 379 | having to load those plugins into memory. This can be used |
---|
| 380 | to provide a codec selection list for encoders, or it can be used |
---|
| 381 | for autoplugging purposes for media players. All current |
---|
| 382 | &GStreamer;-based media players and autopluggers work this way. |
---|
| 383 | We'll look closer at these features as we learn about |
---|
| 384 | <classname>GstPad</classname> and <classname>GstCaps</classname> |
---|
| 385 | in the next chapter: <xref linkend="chapter-pads"/> |
---|
| 386 | </para> |
---|
| 387 | </sect2> |
---|
| 388 | </sect1> |
---|
| 389 | |
---|
| 390 | <sect1 id="section-elements-link" xreflabel="Linking elements"> |
---|
| 391 | <title>Linking elements</title> |
---|
| 392 | <para> |
---|
| 393 | By linking a source element with zero or more filter-like |
---|
| 394 | elements and finally a sink element, you set up a media |
---|
| 395 | pipeline. Data will flow through the elements. This is the |
---|
| 396 | basic concept of media handling in &GStreamer;. |
---|
| 397 | </para> |
---|
| 398 | <figure float="1" id="section-link"> |
---|
| 399 | <title>Visualisation of three linked elements</title> |
---|
| 400 | <mediaobject> |
---|
| 401 | <imageobject> |
---|
| 402 | <imagedata fileref="images/linked-elements.ℑ" |
---|
| 403 | format="&IMAGE;"/> |
---|
| 404 | </imageobject> |
---|
| 405 | </mediaobject> |
---|
| 406 | </figure> |
---|
| 407 | <para> |
---|
| 408 | By linking these three elements, we have created a very simple |
---|
| 409 | chain of elements. The effect of this will be that the output of |
---|
| 410 | the source element (<quote>element1</quote>) will be used as input |
---|
| 411 | for the filter-like element (<quote>element2</quote>). The |
---|
| 412 | filter-like element will do something with the data and send the |
---|
| 413 | result to the final sink element (<quote>element3</quote>). |
---|
| 414 | </para> |
---|
| 415 | <para> |
---|
| 416 | Imagine the above graph as a simple Ogg/Vorbis audio decoder. The |
---|
| 417 | source is a disk source which reads the file from disc. The second |
---|
| 418 | element is a Ogg/Vorbis audio decoder. The sink element is your |
---|
| 419 | soundcard, playing back the decoded audio data. We will use this |
---|
| 420 | simple graph to construct an Ogg/Vorbis player later in this manual. |
---|
| 421 | </para> |
---|
| 422 | <para> |
---|
| 423 | In code, the above graph is written like this: |
---|
| 424 | </para> |
---|
| 425 | <programlisting><!-- example-begin elementlink.c a --> |
---|
| 426 | #include <gst/gst.h> |
---|
| 427 | |
---|
| 428 | int |
---|
| 429 | main (int argc, |
---|
| 430 | char *argv[]) |
---|
| 431 | { |
---|
| 432 | GstElement *source, *filter, *sink; |
---|
| 433 | |
---|
| 434 | /* init */ |
---|
| 435 | gst_init (&argc, &argv); |
---|
| 436 | |
---|
| 437 | /* create elements */ |
---|
| 438 | source = gst_element_factory_make ("fakesrc", "source"); |
---|
| 439 | filter = gst_element_factory_make ("identity", "filter"); |
---|
| 440 | sink = gst_element_factory_make ("fakesink", "sink"); |
---|
| 441 | |
---|
| 442 | /* link */ |
---|
| 443 | gst_element_link_many (source, filter, sink, NULL); |
---|
| 444 | <!-- example-end elementlink.c a --> |
---|
| 445 | [..]<!-- example-begin elementlink.c b --><!-- |
---|
| 446 | return 0; |
---|
| 447 | --><!-- example-end elementlink.c b --> |
---|
| 448 | <!-- example-begin elementlink.c c --> |
---|
| 449 | } |
---|
| 450 | <!-- example-end elementlink.c c --></programlisting> |
---|
| 451 | <para> |
---|
| 452 | For more specific behaviour, there are also the functions |
---|
| 453 | <function>gst_element_link ()</function> and |
---|
| 454 | <function>gst_element_link_pads ()</function>. You can also obtain |
---|
| 455 | references to individual pads and link those using various |
---|
| 456 | <function>gst_pad_link_* ()</function> functions. See the API |
---|
| 457 | references for more details. |
---|
| 458 | </para> |
---|
| 459 | </sect1> |
---|
| 460 | |
---|
| 461 | <sect1 id="section-elements-states"> |
---|
| 462 | <title>Element States</title> |
---|
| 463 | <para> |
---|
| 464 | After being created, an element will not actually perform any actions |
---|
| 465 | yet. You need to change elements state to make it do something. |
---|
| 466 | &GStreamer; knows four element states, each with a very specific |
---|
| 467 | meaning. Those four states are: |
---|
| 468 | </para> |
---|
| 469 | <itemizedlist> |
---|
| 470 | <listitem> |
---|
| 471 | <para> |
---|
| 472 | <classname>GST_STATE_NULL</classname>: this is the default state. |
---|
| 473 | This state will deallocate all resources held by the element. |
---|
| 474 | </para> |
---|
| 475 | </listitem> |
---|
| 476 | <listitem> |
---|
| 477 | <para> |
---|
| 478 | <classname>GST_STATE_READY</classname>: in the ready state, an |
---|
| 479 | element has allocated all of its global resources, that is, |
---|
| 480 | resources that can be kept within streams. You can think about |
---|
| 481 | opening devices, allocating buffers and so on. However, the |
---|
| 482 | stream is not opened in this state, so the stream positions is |
---|
| 483 | automatically zero. If a stream was previously opened, it should |
---|
| 484 | be closed in this state, and position, properties and such should |
---|
| 485 | be reset. |
---|
| 486 | </para> |
---|
| 487 | </listitem> |
---|
| 488 | <listitem> |
---|
| 489 | <para> |
---|
| 490 | <classname>GST_STATE_PAUSED</classname>: in this state, an |
---|
| 491 | element has opened the stream, but is not actively processing |
---|
| 492 | it. An element should not modify the stream's position, data or |
---|
| 493 | anything else in this state. When set back to PLAYING, it should |
---|
| 494 | continue processing at the point where it left off as soon as |
---|
| 495 | possible. |
---|
| 496 | </para> |
---|
| 497 | </listitem> |
---|
| 498 | <listitem> |
---|
| 499 | <para> |
---|
| 500 | <classname>GST_STATE_PLAYING</classname>: in the PLAYING state, |
---|
| 501 | an element does exactly the same as in the PAUSED state, except |
---|
| 502 | that it actually processes data. |
---|
| 503 | </para> |
---|
| 504 | </listitem> |
---|
| 505 | </itemizedlist> |
---|
| 506 | <para> |
---|
| 507 | You can change the state of an element using the function |
---|
| 508 | <function>gst_element_set_state ()</function>. If you set an element |
---|
| 509 | to another state, &GStreamer; will internally traverse all intermediate |
---|
| 510 | states. So if you set an element from NULL to PLAYING, &GStreamer; |
---|
| 511 | will internally set the element to READY and PAUSED in between. |
---|
| 512 | </para> |
---|
| 513 | <para> |
---|
| 514 | Even though an element in <classname>GST_STATE_PLAYING</classname> |
---|
| 515 | is ready for data processing, it will not necessarily do that. If |
---|
| 516 | the element is placed in a thread (see <xref |
---|
| 517 | linkend="chapter-threads"/>), it will process data automatically. |
---|
| 518 | In other cases, however, you will need to <emphasis>iterate</emphasis> |
---|
| 519 | the element's container. |
---|
| 520 | </para> |
---|
| 521 | </sect1> |
---|
| 522 | </chapter> |
---|