--- /dev/null
+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
+
+