mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-09 05:38:58 +00:00
177 lines
4.4 KiB
Text
177 lines
4.4 KiB
Text
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
|
|
|
|
|