mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-29 05:01:23 +00:00
Another type system proposal.
Original commit message from CVS: Another type system proposal.
This commit is contained in:
parent
64b4ac5cdf
commit
f2128112c3
1 changed files with 173 additions and 0 deletions
173
docs/random/types3
Normal file
173
docs/random/types3
Normal file
|
@ -0,0 +1,173 @@
|
|||
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
|
||||
|
||||
|
Loading…
Reference in a new issue