<chapter id="cha-elements">
  <title>GstElement</title>
  <para> 
    The most important object in GStreamer for the application programmer is
    the GstElement object. 
  </para>

  <sect1 id="sec-elements-design">
    <title>What is a GstElement</title>
    <para> 
      The GstElement is the basic building block for the media pipeline. All the
      different components you are going to use are derived from this GstElement.
      This means that a lot of functions you are going to use operate on this object.
    </para>
    <para> 
      We will first describe the three most important types of elements that you are 
      going to use. They are the Source, Filter and Sink elements.
    </para>
    <para> 
      You will also see that those elements have pads. These are the elements 
      connections with the 'outside' world.
    </para>
    <sect2 id="sec-elements-src">
      <title>GStreamer source elements (<classname>GstSrc</classname>)</title>
      <para>
        This element will generate data that will be used by the pipeline. It is
	typically a file or an audio source.
      </para>
      <para>
        Below you see how we will visualize the <classname>GstSrc</classname> element.
	We always draw a src pad to the right of the element.
      </para>
      <figure float="1" id="sec-element-srcimg">
        <title>Visualisation of a <classname>GstSrc</classname> element</title>
        <graphic fileref="images/src-element" format="png"></graphic>
      </figure>
      <para>
        Source elements do not accept data, they only generate data. You can see
	this in the figure because it only has a src pad. A src pad can only 
	generate buffers.
      </para>

    </sect2>
    <sect2 id="sec-elements-filter">
      <title>GStreamer filter elements (<classname>GstFilter</classname>)</title>
      <para>
        Filter elements both have an input and an output pad. They operate on data
	they receive in the sink pad and send the result to the src pad.
      </para> 
      <para>
        Examples of a filter element might include: an MPEG decoder, volume filter,...
      </para> 
      <para>
        Filters may also contain any number of input pads and output pads. For example,
	a video mixer might have to input pads (the images of the two different video 
	streams) and one output pad. 
      </para> 
      <figure float="1" id="sec-element-filterimg">
        <title>Visualisation of a <classname>GstFilter</classname> element</title>
        <graphic fileref="images/filter-element" format="png"></graphic>
      </figure>
      <para>
        The above figure shows the visualisation of a filter element. This element has 
	one sink pad (input) and one src (output) pad. Sink pads are drawn on the left
	of the element.
      </para> 
      <figure float="1" id="sec-element-multifilterimg">
        <title>Visualisation of a <classname>GstFilter</classname> element with
	  more than one output pad</title>
        <graphic fileref="images/filter-element-multi" format="png"></graphic>
      </figure>
      <para>
        The above figure shows the visualisation of a filter element with more than one
	output pad. An example of such a filter is the AVI splitter. This element will
	parse the input data and extracts the audio and video data. Most of these filters
	dynamically send out a signal when a new pad is created so that the application
	programmer can connect an arbitrary element to the newly created pad.
      </para> 
    </sect2>
  
    <sect2 id="sec-elements-sink">
      <title>GStreamer sink elements (<classname>GstSink</classname>)</title>
      <para> 
        This element accepts data but will not generate any new data. A sink element 
	is typically a file on disk, a soundcard, a display,... It is presented as
	below:
      </para> 
      <figure float="1" id="sec-element-sinkimg">
        <title>Visualisation of a <classname>GstSink</classname> element</title>
        <graphic fileref="images/sink-element" format="png"></graphic>
      </figure>
    </sect2>

  </sect1>
</chapter>