purpose
-------

GStreamer has a very flexible mechanism to describe media types using
mime types and key/value pairs (GstCaps). The definition of media types 
is entirely done by the plugins which can set the media type to one or 
more of the plugins GstPads. 

Pads with the same mime type and 'compatible' properties are allowed to
connect. It is possible that a pad can accept or produce many different 
media types.

The purpose of caps negotiation is to provide a framework for plugins so
that they can agree on a common media type for their pads.


Capabilities (GstCaps)
----------------------

The core component in the caps negotiation system are GstCaps. They consist
of:

 - a name (ex. "my_audio_capabilities") 
 - a mime-type (ex. audio/raw, audio/mp3, ...)
 - a list of key/value pairs (ex. channels=2, rate=44100, ...)

The list of key/value pairs is maintained by the GstProps object.

The GstProps object maintains a GList of GstPropsEntries. An entry has
a key, which is always a string constant (internally converted to a GQuark)
and a value, which can be one of the following:

 - an integer constant (ex. 5)
 - a float contant (ex. 1.0)
 - a string constant (ex. "int")
 - a boolean constant (ex. FALSE)
 - a fourcc constant (ex. I420) 
     * fourcc codes are usually used to describe a video format

In addition to these constant values, the following variable values are
supported too:

 - an integer range (ex. 0-200)
 - a float range (ex. 1.0-3.0)
 - a list of values (ex. 1, 2, 5). 
     * A List cannot contain another list and the
       entries in the list should all have the
       same type (int, float, string, fourcc). It is
       allowed to mix integers/floats and  
       integer/float ranges in a list.

A capability is usually described as follows:

                                GST_CAPS_NEW (
      capability name --->        "my_audio_capabilities",
      mime-type --------->        "audio/raw",
                          (        "format",	GST_PROPS_STRING ("int"),
      GstProps ---------> (        "channels",	GST_PROPS_INT_RANGE (1, 2),
       (list of entries)  (        "rate",	GST_PROPS_INT (44100)
                                )

				(-----------)   (--------------------------)
                                  entry key         entry value

Two capabilities can be chained together to form a larger capability:

                              (  GST_CAPS_NEW (
                              (    "my_mp3_capability",
	                      (    "audio/mp3",
	one capability ---->  (    NULL    
        created by chaining   (  ),
        two capabilities.     (  GST_CAPS_NEW (
                              (    "my_vorbis_capability",
	                      (    "audio/vorbis",
	                      (    NULL
                              (  )

Capabilities always work as constraints, this means that they constrain the
media type to the given mime-type and properties. By this definition a NULL 
GstCaps or a NULL GstProps means: no constraints.


Variable capabilities vs. fixed capabilities
--------------------------------------------

Definition:

  A GstProps structure is said to be fixed if it doesn't contain lists or
  ranges, otherwise it is a variable GstProps. A variable GstProps, by definitin
  does not constrain the media type to a set of fixed properties.

  A GstCaps is said to be fixed if it is not chained and it doesn't contain
  a variable GstProps component.


GstCaps compatibility
---------------------

<write me>

GstCaps intersection
--------------------

<write me>


GstCaps usage
-------------

GstCaps are used in the following data structures:

 - padtemplates. 
    * padtemplates are added to elementfactory to describe the possible
      pads that an element created from said factory can have.
    * padtemplates contain the name, direction and presence of the pads.
    * padtemplates also describe the media types that this element can
      accept/produce using GstCaps.
    * padtemplates can provide fixed or variable GstCaps for the pads.
    * padtemplates can be used by the element to create its pads and is
      highly recommended.
    * the padtemplate GstCaps are saved into the registry so that the
      media types an element can operate on, are known without having to
      bring the element into memory.
      
 - pad caps
    * pad caps are _fixed_ caps attached to a pad to describe the exact media
      type this pad is handling. A pad with caps is said to be a "tainted" pad.
      
 - connection filters
    * a connection filter is created when two pads are connected. It describes 
      the media type(s) that _can_ flow through this connection. 

 - application connection filters
    * When the application connects two pads, it can specify an application
      connection filter that will act as additional constraints on the media types
      that can flow through the connection.

Connection filters and application filters are cleared when two connected pads 
are disconnected. Pad caps are not cleared.  Padtemplates are immutable and 
never cleared.


The GstPad get_caps function
----------------------------

the gst_pad_get_caps function returns the caps of a given pad. The pad caps are
calculated as:

 - if the pad has pad caps, return those
 - else if the pad has a getcaps function, call the function and return the result
 - else if the pad has a padtemplate, return the padtemplate caps
 - else return NULL


Purpose of caps negotiation
---------------------------

The purpose of the caps negotiation procedure is to set "pad caps" on a pad
so that it is compatible with the "connection filter". This has to be done 
_before_ any data passing happens through the connection.  Data passing between two 
pads is _not_ allowed when the pad caps are not compatible with the connection 
filter or when the pad caps of two pads participating in the connection are not
equal.

Real caps negotiation starts as soon as an element is in the READY state or higher.
This means that the connect functions of the pads are only called when the element
is at least READY. The intersection between two pads is made at connect time, 
regardless of element state.


GstPad connection
-----------------

When two pads are connected get_caps is called on both pads to get their caps.
Then the intersection between those caps is made, this will give us all the
possible media types that can flow through this pad connection. Optionally the
application can provide additional caps, the pad intersection is also made with
the application caps. 

The intersection and the optional application caps are stored in the two pads.

If the intersection is NULL, the two pads have no common types and the connection
is refused.

If the intersection is a fixed caps, this means there is only one possible media type
that can be used for this connection.

For all not NULL intersections the pad connect functions are called with the 
intersection. Depending on the result of the connect funtion the connection is
allowed or refused.

If the intersection is fixed and the pad connect functions agreed to the caps, 
the caps are set on the pads.

Note that pad caps are never set for non fixed caps.

!Example 1:
! 
! 1. before connecting the pads, they both have a set of possible media types,
!    on the pad, through the getcaps function or on the padtemplate (here
!    represented with capital letters)
!
!    srcpad                       sinkpad
!       A                           B
!       B                           F
!       C                           A
!	                            G
!
! 2. when performing the connection, the intersection between the two sets of caps
!    is made.
!    
!    srcpad                       sinkpad
!       A )                      (  B
!       B )-------->  A   <------(  F
!       C )           B          (  A
! 	                         (  G
! 
! 3. In this case the intersection is not a fixed caps (it's a chained caps).
!    the connect function of the two pads are called (if any), the connect
!    function can accept of refuse the caps.
! 
! 4. if the caps are accepted, the intersection caps are set on both pads.
! 
! 5. plugins will typically not configure themselves if they get variable caps.
!    It is possible though for a plugin to select one of the caps, fixate
!    some properties and refine the filter to fixed caps (see later)
!


!Example 2:
! 
! 1. we take two pads that intersect to fixed caps (B):
! 
!    srcpad                       sinkpad
!       A  )                     (  B
!       B  )------->  B  <-------(  F
! 
! 2. both pad connect functions are called. 
! 
! 3. assuming the connect functions did not refuse the connection, the caps
!    are set on both pads (because they are fixed).
! 
!    srcpad  (B)--------------(B) sinkpad
!       A                           B
!       B                           F
! 
   
!Example 3:
! 
! 1. we take two pads, one with pad caps, another one with a padtemplate. 
! 
!    srcpad (B)                   sinkpad
!            !                   (  B
!            ------>  B  <-------(  F
! 
! 2. the pad get_caps function will return the pad caps of the srcpad and
!    the padtemplate caps of the sinkpad. The intersection is made, yielding
!    a fixed caps (B) which is sent to both connect functions (if any)
!
! 3. If the connect function(s) didn't refuse the connection the fixed caps
!    are set on both pads. The intersection is also kept in the pad object.
!
!    srcpad  (B)--------------(B) sinkpad
!                                   B
!                                   F
!
! 4. when fixed caps are received on the sinkpad the plugin will typically 
!    configure itself to deal with the format.
!


Pad connect functions
---------------------

A Pad can be notified when another pad is connected or reconnected to it with
fixed or variable caps. This notification will be done with the optional 
GstPadConnectFunction callback that an element can provide for a pad.
Remember that this connection is _always_ called, not only whith fixed caps
but also with variable caps (if any).

We will explain some of the common situations with some examples.

!Example 4:
!
! 1. We have a simple mpeg audio decoder connected to a simple audio sink.
!    The mpeg decoder doesn't have a connect function on 
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!







      











