<!-- ############ chapter ############# -->

<chapter id="chapter-intro-basics" xreflabel="Foundations">
  <title>Foundations</title>
  <para><!-- synchronize with AppDevMan -->
    This chapter of the guide introduces the basic concepts of &GStreamer;.
    Understanding these concepts will help you grok the issues involved in
    extending &GStreamer;. Many of these concepts are explained in greater
    detail in the &GstAppDevMan;; the basic concepts presented here serve mainly
    to refresh your memory.
  </para>

  <!-- ############ sect1 ############# -->

  <sect1 id="section-basics-elements" xreflabel="Elements and Plugins">
    <title>Elements and Plugins</title>
    <para>
      Elements are at the core of &GStreamer;. In the context of plugin
      development, an <emphasis>element</emphasis> is an object derived from the
      <ulink type="http" url="../../gstreamer/html/GstElement.html"><classname>
      GstElement</classname></ulink> class. Elements provide some sort of
      functionality when linked with other elements: For example, a source
      element provides data to a stream, and a filter element acts on the data
      in a stream. Without elements, &GStreamer; is just a bunch of conceptual
      pipe fittings with nothing to link. A large number of elements ship
      with &GStreamer;, but extra elements can also be written.
    </para>
    <para>
      Just writing a new element is not entirely enough, however: You will need
      to encapsulate your element in a <emphasis>plugin</emphasis> to enable
      &GStreamer; to use it. A plugin is essentially a loadable block of code,
      usually called a shared object file or a dynamically linked library. A
      single plugin may contain the implementation of several elements, or just
      a single one. For simplicity, this guide concentrates primarily on plugins
      containing one element.
    </para>
    <para>
      A <emphasis>filter</emphasis> is an important type of element that
      processes a stream of data. Producers and consumers of data are called
      <emphasis>source</emphasis> and <emphasis>sink</emphasis> elements,
      respectively. <emphasis>Bin</emphasis> elements contain other elements.
      One type of bin is responsible for synchronization of the elements that they
      contain so that data flows smoothly. Another type of bin, called
      <emphasis>autoplugger</emphasis> elements, automatically add other
      elements to the bin and links them together so that they act as a
      filter between two arbitrary stream types.
    </para>
    <para>
      The plugin mechanism is used everywhere in &GStreamer;, even if only the
      standard packages are being used. A few very basic functions reside in the
      core library, and all others are implemented in plugins. A plugin registry
      is used to store the details of the plugins in an binary registry file.
      This way, a program using &GStreamer; does not have to load all plugins to
      determine which are needed. Plugins are only loaded when their provided
      elements are requested.
    </para>
    <para>
      See the &GstLibRef; for the current implementation details of <ulink
      type="http"
      url="../../gstreamer/html/GstElement.html"><classname>GstElement</classname></ulink>
      and <ulink type="http"
      url="../../gstreamer/html/GstPlugin.html"><classname>GstPlugin</classname></ulink>.
    </para>
  </sect1>

  <!-- ############ sect1 ############# -->

  <sect1 id="section-basics-pads" xreflabel="Pads">
    <title>Pads</title>
    <para>
      <emphasis>Pads</emphasis> are used to negotiate links and data flow
      between elements in &GStreamer;. A pad can be viewed as a
      <quote>place</quote> or <quote>port</quote> on an element where
      links may be made with other elements, and through which data can
      flow to or from those elements.  Pads have specific data handling
      capabilities: A pad can restrict the type of data that flows
      through it.  Links are only allowed between two pads when the
      allowed data types of the two pads are compatible.
    </para>
    <para>
      An analogy may be helpful here. A pad is similar to a plug or jack on a
      physical device. Consider, for example, a home theater system consisting
      of an amplifier, a DVD player, and a (silent) video projector. Linking
      the DVD player to the amplifier is allowed because both devices have audio
      jacks, and linking the projector to the DVD player is allowed because
      both devices have compatible video jacks. Links between the
      projector and the amplifier may not be made because the projector and
      amplifier have different types of jacks. Pads in &GStreamer; serve the
      same purpose as the jacks in the home theater system.
    </para>
    <para>
      For the most part, all data in &GStreamer; flows one way through a link
      between elements. Data flows out of one element through one or more
      <emphasis>source pads</emphasis>, and elements accept incoming data through
      one or more <emphasis>sink pads</emphasis>. Source and sink elements have
      only source and sink pads, respectively.
    </para>
    <para>
      See the &GstLibRef; for the current implementation details of a <ulink
      type="http"
      url="../../gstreamer/html/GstPad.html"><classname>GstPad</classname></ulink>.
    </para>
  </sect1>

  <!-- ############ sect1 ############# -->

  <sect1 id="section-basics-data" xreflabel="Data, Buffers and Events">
    <title>GstMiniObject, Buffers and Events</title>
    <para>
      All streams of data in &GStreamer; are chopped up into chunks that are
      passed from a source pad on one element to a sink pad on another element.
      <emphasis>GstMiniObject</emphasis> is the structure used to hold these
      chunks of data.
    </para>
    <para>
      GstMiniObject contains the following important types:
      <itemizedlist>
        <listitem>
          <para>
            An exact type indicating what type of data (event, buffer, ...)
            this GstMiniObject is.
          </para>
        </listitem>
        <listitem>
          <para>
            A reference count indicating the number of elements currently
            holding a reference to the miniobject. When the reference count
            falls to zero, the miniobject will be disposed, and its memory will be
            freed in some sense (see below for more details).
          </para>
        </listitem>
      </itemizedlist>
    </para>
    <para>
      For data transport, there are two types of GstMiniObject defined:
      events (control) and buffers (content).
    </para>
    <para>
      Buffers may contain any sort of data that the two linked pads
      know how to handle. Normally, a buffer contains a chunk of some sort of
      audio or video data that flows from one element to another.
    </para>
    <para>
      Buffers also contain metadata describing the buffer's contents. Some of
      the important types of metadata are:
      <itemizedlist>
        <listitem>
          <para>
            Pointers to one or more GstMemory objects. GstMemory objects are
            refcounted objects that encapsulate a region of memory.
          </para>
        </listitem>
        <listitem>
          <para>
            A timestamp indicating the preferred display timestamp of the
            content in the buffer.
          </para>
        </listitem>
      </itemizedlist>
    </para>
    <para>
      Events
      contain information on the state of the stream flowing between the two
      linked pads. Events will only be sent if the element explicitly supports
      them, else the core will (try to) handle the events automatically. Events
      are used to indicate, for example, a media type, the end of a
      media stream or that the cache should be flushed.
    </para>
    <para>
      Events may contain several of the following items:
      <itemizedlist>
        <listitem>
          <para>
            A subtype indicating the type of the contained event.
          </para>
        </listitem>
        <listitem>
          <para>
            The other contents of the event depend on the specific event type.
          </para>
        </listitem>
      </itemizedlist>
    </para>
    <para>
      Events will be discussed extensively in <xref linkend="chapter-advanced-events"/>.
      Until then, the only event that will be used is the <emphasis>EOS</emphasis>
      event, which is used to indicate the end-of-stream (usually end-of-file).
    </para>
    <para>
      See the &GstLibRef; for the current implementation details of a <ulink
      type="http"
      url="../../gstreamer/html/gstreamer-GstMiniObject.html"><classname>GstMiniObject</classname></ulink>, <ulink type="http"
      url="../../gstreamer/html/GstBuffer.html"><classname>GstBuffer</classname></ulink> and <ulink type="http"
      url="../../gstreamer/html/GstEvent.html"><classname>GstEvent</classname></ulink>.
    </para>

    <sect2 id="sect2-buffer-allocation" xreflabel="Buffer Allocation">
      <title>Buffer Allocation</title>
      <para>
        Buffers are able to store chunks of memory of several different
	types.  The most generic type of buffer contains memory allocated
	by malloc().  Such buffers, although convenient, are not always
	very fast, since data often needs to be specifically copied into
	the buffer.
      </para>
      <para>
	Many specialized elements create buffers that point to special
	memory.  For example, the filesrc element usually
	maps a file into the address space of the application (using mmap()),
	and creates buffers that point into that address range.  These
	buffers created by filesrc act exactly like generic buffers, except
	that they are read-only.  The buffer freeing code automatically
	determines the correct method of freeing the underlying memory.
	Downstream elements that receive these kinds of buffers do not
	need to do anything special to handle or unreference it.
      </para>
      <para>
        Another way an element might get specialized buffers is to
        request them from a downstream peer through a GstBufferPool or
        GstAllocator.  Elements can ask a GstBufferPool or GstAllocator
        from the downstream peer element. If downstream is able to provide
        these objects, upstream can use them to allocate buffers.
        See more in <xref linkend="chapter-allocation"/>.
      </para>
      <para>
        Many sink elements have accelerated methods for copying data
	to hardware, or have direct access to hardware.  It is common
        for these elements to be able to create a GstBufferPool or 
        GstAllocator for their upstream peers.  One such example is
	ximagesink.  It creates buffers that contain XImages.  Thus,
	when an upstream peer copies data into the buffer, it is copying
	directly into the XImage, enabling ximagesink to draw the
	image directly to the screen instead of having to copy data
	into an XImage first.
      </para>
      <para>
        Filter elements often have the opportunity to either work on
	a buffer in-place, or work while copying from a source buffer
	to a destination buffer.  It is optimal to implement both
	algorithms, since the &GStreamer; framework can choose the
	fastest algorithm as appropriate.  Naturally, this only makes
	sense for strict filters -- elements that have exactly the
	same format on source and sink pads.
      </para>
    </sect2>
  </sect1>

  <!-- ############ sect1 ############# -->

  <sect1 id="section-basics-types" xreflabel="Types and Properties">
    <title>Media types and Properties</title>
    <para>
      &GStreamer; uses a type system to ensure that the data passed between
      elements is in a recognized format. The type system is also important
      for ensuring that the parameters required to fully specify a format match
      up correctly when linking pads between elements. Each link that is
      made between elements has a specified type and optionally a set of
      properties. See more about caps negotiation in
      <xref linkend="chapter-negotiation"/>.
    </para>

    <!-- ############ sect2 ############# -->

    <sect2 id="sect2-types-basictypes" xreflabel="Basic Types">
      <title>The Basic Types</title>
      <para>
        &GStreamer; already supports many basic media types. Following is a
        table of a few of the basic types used for buffers in
        &GStreamer;. The table contains the name ("media type") and a
        description of the type, the properties associated with the type, and
        the meaning of each property. A full list of supported types is
        included in <xref linkend="section-types-definitions"/>.
      </para>

      <table frame="all" id="table-basictypes" xreflabel="Table of Example Types">
        <title>Table of Example Types</title>
        <tgroup cols="6" align="left" colsep="1" rowsep="1">

        <thead>
          <row>
            <entry>Media Type</entry>
            <entry>Description</entry>
            <entry>Property</entry>
            <entry>Property Type</entry>
            <entry>Property Values</entry>
            <entry>Property Description</entry>
          </row>
        </thead>

        <tbody valign="top">

          <!-- ############ type ############# -->

          <row>
            <entry morerows="1">audio/*</entry>
            <entry morerows="1">
              <emphasis>All audio types</emphasis>
            </entry>
            <entry>rate</entry>
            <entry>integer</entry>
            <entry>greater than 0</entry>
            <entry>
              The sample rate of the data, in samples (per channel) per second.
            </entry>
          </row>
          <row>
            <entry>channels</entry>
            <entry>integer</entry>
            <entry>greater than 0</entry>
            <entry>
              The number of channels of audio data.
            </entry>
          </row>

          <!-- ############ type ############# -->

          <row>
            <entry>audio/x-raw</entry>
            <entry>
              Unstructured and uncompressed raw integer audio data.
            </entry>
            <entry>format</entry>
            <entry>string</entry>
            <entry>
              S8 U8 S16LE S16BE U16LE U16BE S24_32LE S24_32BE U24_32LE U24_32BE S32LE S32BE U32LE U32BE
              S24LE S24BE U24LE U24BE S20LE S20BE U20LE U20BE S18LE S18BE U18LE U18BE F32LE F32BE F64LE F64BE
            </entry>
            <entry>
              The format of the sample data.
            </entry>
          </row>

          <!-- ############ type ############# -->

          <row>
            <entry morerows="3">audio/mpeg</entry>
            <entry morerows="3">
              Audio data compressed using the MPEG audio encoding scheme.
            </entry>
            <entry>mpegversion</entry>
            <entry>integer</entry>
            <entry>1, 2 or 4</entry>
            <entry>
              The MPEG-version used for encoding the data. The value 1 refers
              to MPEG-1, -2 and -2.5 layer 1, 2 or 3. The values 2 and 4 refer
              to the MPEG-AAC audio encoding schemes.
            </entry>
          </row>
          <row>
            <entry>framed</entry>
            <entry>boolean</entry>
            <entry>0 or 1</entry>
            <entry>
              A true value indicates that each buffer contains exactly one
              frame. A false value indicates that frames and buffers do not
              necessarily match up.
            </entry>
          </row>
          <row>
            <entry>layer</entry>
            <entry>integer</entry>
            <entry>1, 2, or 3</entry>
            <entry>
              The compression scheme layer used to compress the data
              <emphasis>(only if mpegversion=1)</emphasis>.
            </entry>
          </row>
          <row>
            <entry>bitrate</entry>
            <entry>integer</entry>
            <entry>greater than 0</entry>
            <entry>
              The bitrate, in bits per second. For VBR (variable bitrate)
              MPEG data, this is the average bitrate.
            </entry>
          </row>

          <!-- ############ type ############# -->

          <row>
            <entry>audio/x-vorbis</entry>
            <entry>Vorbis audio data</entry>
            <entry></entry>
            <entry></entry>
            <entry></entry>
            <entry>
              There are currently no specific properties defined for this type.
            </entry>
          </row>
        </tbody>
      </tgroup>
      </table>
    </sect2>
  </sect1>
</chapter>
