SOMEWHAT OUTDATED, design still holds though
--------------------------------------------


1. Introduction
---------------

The type system is used to attach meaning to the bytes in a GstBuffer.
A plugin can decide to add metadata to the GstBuffer, this metadata
will carry an associated typeid.

Types are also used by the plugins to expose the type of their pads to
the type system.

Types are essential for autoplugging. 

We will explain the inner workings of the type system in this document, as
well as the API used in the plugins.

2. major types
--------------

major types are identified with mime types and are used to denote a 
family of types.

More specific information about the type is given using properties. This
will allow us to be very specific without creating a lot of mime types.

3. API
------

Both a simple array based specification and a real API will be
provided to build the capabilities. 

In the array based approach, we basically build an array of pointers.
Some macros will be available to specify ranges, boolean values, lists
and id's. (not sure if this can be done)

#define GST_TYPE_INT_RANGE(a, b) GST_TYPE_RANGE,(a),(b)
#define GST_TYPE_BOOLEAN(a) GST_TYPE_BOOLEAN,(a)
#define GST_TYPE_LIST(a...) GST_TYPE_LIST,(##a),NULL

for example:

  static GstTypeCapsFactory mpg123_sink_caps[] = {
    "audio/mp3",
    "layer", 	GST_TYPE_INT_RANGE (1, 3),
    "bitrate",	GST_TYPE_INT_RANGE (8, 320),
    "framed",	GST_TYPE_BOOLEAN (true),
    NULL
  };

will expand to the array:

  static GstTypeCapsFactory mpg123_sink_caps[] = {
    "audio/mp3",
    "layer", 	GST_TYPE_RANGE,1,3,
    "bitrate",	GST_TYPE_RANGE,8,320,
    "famed",	GST_TYPE_BOOLEAN,true,
    NULL,
  };

when we register the caps factory, the strings will be converted
into GQuarks and be stored into a GData Keyed Data List.

This will result in a GstTypeCaps structure:

struct _GstTypeCaps {
  guint16 id;                 // if of the major type 

  GData *properties;
}

4. example using arrays
-----------------------

mpg123: an mpeg audio decoder.

  // a factory for the major type we use
  static GstTypeFactory mp3factory = {
    "audio/mp3",		// major type
    ".mp3 .mp2 .mp1 .mpga",	// extenstions
    NULL,			// typefind function
  };

  // capabilities of the sink pad
  static GstTypeCapsFactory mpg123_sink_caps[] = {
    "audio/mp3",
    "layer", 	GST_TYPE_INT_RANGE (1, 3),
    "bitrate",	GST_TYPE_INT_RANGE (8, 320),
    "framed",	GST_TYPE_BOOLEAN (true),
    NULL
  };

  // capabilities of the source pad
  static GstTypeCapsFactory mpg123_src_caps[] = {
    "audio/raw",
    "rate", 	GST_TYPE_INT_RANGE (8000, 48000),
    "channels",	GST_TYPE_INT_RANGE (1, 2),
    NULL
  };

  static GstTypeCaps *sinkcaps = NULL, *rawcaps = NULL;

  static gst_mpg123_init (GstMpg123 *mpg123) 
  {
    mpg123->sinpad = gst_pad_new ("sink", GST_PAD_SINK);
    gst_element_add_pad (GST_ELEMENT (mpg123), mpg123->sinkpad);
    gst_pad_set_caps (mpg123->sinkpad, sinkcaps);

    ...
  }

  GstPlugin *plugin_init (GModule *module)
  {
    ...
    plugin = gst_plugin_new ("mpg123");
   
    gst_plugin_add_type_factory (plugin, mp3factory);
  
    ...
    sinkcaps = gst_type_register_caps (mpg123_sink_caps, NULL);
    rawcaps  = gst_type_register_caps (mpg123_src_caps, NULL);
    ...
  }

mpeg2dec: an mpeg video decoder that can do mpeg1 and mpeg2.

  static GstTypeFactory mpegfactory = {
    "video/mpeg",		// major type
    ".mpg .mpeg",		// extenstions
    NULL,			// typefind function
  };

  static GstTypeCapsFactory mpeg2dec_sink_caps[] = {
    "video/mpeg",
    "mpegtype", GST_TYPE_LIST (
                        GST_TYPE_INT(1),
                        GST_TYPE_INT(2),
			),
    NULL
  };

  static GstTypeCapsFactory mpeg2dec_src_caps[] = {
    "video/raw",
    "fourcc", 	GST_TYPE_LIST (
                        GST_TYPE_INT32 (0x32315659), 
			GST_TYPE_INT32 (0x32...), 
			),
    "width",	GST_TYPE_INT_RANGE (16, 4096),
    "height",	GST_TYPE_INT_RANGE (16, 4096),
    NULL
  };

  static GstTypeCaps *sinkcaps = NULL, *rawcaps = NULL;

  GstPlugin *plugin_init (GModule *module)
  {
    ...
    plugin = gst_plugin_new ("mpeg2dec");
   
    ...
    sinkcaps = gst_type_register_caps (mpeg2dec_sink_caps, NULL);
    rawcaps  = gst_type_register_caps (mpeg2dec_src_caps, NULL);
    ...
  }


5. capabilty compatibility
--------------------------

Two pads are compatible if:

- The major types are equal
- range of the sink pad contains the range of the src pad
 

