| <chapter id="chapter-data"> |
| <title>Buffers and Events</title> |
| <para> |
| The data flowing through a pipeline consists of a combination of |
| buffers and events. Buffers contain the actual media data. Events |
| contain control information, such as seeking information and |
| end-of-stream notifiers. All this will flow through the pipeline |
| automatically when it's running. This chapter is mostly meant to |
| explain the concept to you; you don't need to do anything for this. |
| </para> |
| |
| <sect1 id="section-buffers"> |
| <title>Buffers</title> |
| <para> |
| Buffers contain the data that will flow through the pipeline you have |
| created. A source element will typically create a new buffer and pass |
| it through a pad to the next element in the chain. When using the |
| GStreamer infrastructure to create a media pipeline you will not have |
| to deal with buffers yourself; the elements will do that for you. |
| </para> |
| <para> |
| A buffer consists, amongst others, of: |
| </para> |
| <itemizedlist> |
| <listitem> |
| <para> |
| Pointers to memory objects. Memory objects encapsulate a region |
| in the memory. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| A timestamp for the buffer. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| A refcount that indicates how many elements are using this |
| buffer. This refcount will be used to destroy the buffer when no |
| element has a reference to it. |
| </para> |
| </listitem> |
| <listitem> |
| <para> |
| Buffer flags. |
| </para> |
| </listitem> |
| </itemizedlist> |
| <para> |
| The simple case is that a buffer is created, memory allocated, data |
| put in it, and passed to the next element. That element reads the |
| data, does something (like creating a new buffer and decoding into |
| it), and unreferences the buffer. This causes the data to be free'ed |
| and the buffer to be destroyed. A typical video or audio decoder |
| works like this. |
| </para> |
| <para> |
| There are more complex scenarios, though. Elements can modify buffers |
| in-place, i.e. without allocating a new one. Elements can also write |
| to hardware memory (such as from video-capture sources) or memory |
| allocated from the X-server (using XShm). Buffers can be read-only, |
| and so on. |
| </para> |
| </sect1> |
| |
| <sect1 id="section-events"> |
| <title>Events</title> |
| <para> |
| Events are control particles that are sent both up- and downstream in |
| a pipeline along with buffers. Downstream events notify fellow elements |
| of stream states. Possible events include seeking, flushes, |
| end-of-stream notifications and so on. Upstream events are used both |
| in application-element interaction as well as element-element interaction |
| to request changes in stream state, such as seeks. For applications, |
| only upstream events are important. Downstream events are just |
| explained to get a more complete picture of the data concept. |
| </para> |
| <para> |
| Since most applications seek in time units, our example below does so |
| too: |
| </para> |
| <programlisting> |
| static void |
| seek_to_time (GstElement *element, |
| guint64 time_ns) |
| { |
| GstEvent *event; |
| |
| event = gst_event_new_seek (1.0, GST_FORMAT_TIME, |
| GST_SEEK_FLAG_NONE, |
| GST_SEEK_METHOD_SET, time_ns, |
| GST_SEEK_TYPE_NONE, G_GUINT64_CONSTANT (0)); |
| gst_element_send_event (element, event); |
| } |
| </programlisting> |
| <para> |
| The function <function>gst_element_seek ()</function> is a shortcut |
| for this. This is mostly just to show how it all works. |
| </para> |
| </sect1> |
| </chapter> |