mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-25 11:11:08 +00:00
current set of design docs, in .txt format
Original commit message from CVS: current set of design docs, in .txt format
This commit is contained in:
parent
cfb7276682
commit
c824d8eaf9
4 changed files with 166 additions and 0 deletions
31
docs/design/part-conventions.txt
Normal file
31
docs/design/part-conventions.txt
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
Documentation conventions
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Due to the potential for exponential growth, several abbreviating conventions will be used throughout this
|
||||||
|
documentation. These conventions have grown primarily from extremely in-depth discussions of the architecure in IRC.
|
||||||
|
This has verified the safety of these conventions, if used properly. There are no known namespace conflicts as long as
|
||||||
|
context is rigorously observed.
|
||||||
|
|
||||||
|
Object classes
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Since everything starts with Gst, we will generally refer to objects by the shorter name, i.e. Element or Pad. These
|
||||||
|
names will always have their first letter capitalized.
|
||||||
|
|
||||||
|
Function names
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Within the context of a given object, functions defined in that object's header and/or source file will have their
|
||||||
|
object-specific prefix stripped. For instance, gst_element_add_pad() would be referred to as simply _get_pad(). Note
|
||||||
|
that the trailing parentheses should always be present, but sometimes may not be. A prefixing underscore (_) will
|
||||||
|
always tell you it's a function, however, regardless of the presence or absence of the trailing parentheses.
|
||||||
|
|
||||||
|
#defines and enums
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Values and macros defined as enums and preprocessor macros will be referred to in all capitals, as per their
|
||||||
|
definition. This includes object flags and element states, as well as general enums. Examples are the states NULL,
|
||||||
|
READY, PLAYING, and PAUSED; the element flags DECOUPLED and USE_COTHREAD, and state return values SUCCESS, FAILURE, and
|
||||||
|
ASYNC. Where there is a prefix, as in the element flags, this is usually dropped, and implied. Not however that
|
||||||
|
element flags should be cross-checked with the header, as there are currently two conventions in use: with and without
|
||||||
|
_FLAGS_ in the middle.
|
77
docs/design/part-gstelement.txt
Normal file
77
docs/design/part-gstelement.txt
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
gstelement
|
||||||
|
name
|
||||||
|
pads
|
||||||
|
state
|
||||||
|
loopfunction
|
||||||
|
threadstate
|
||||||
|
manager
|
||||||
|
ghostpads
|
||||||
|
|
||||||
|
GstElement
|
||||||
|
==========
|
||||||
|
|
||||||
|
The Element is the most important object in the entire GStreamer system, as it defines the structure of the pipeline.
|
||||||
|
Elements include sources, filters, sinks, and containers (Bins). They may be an intrinsic part of the core GStreamer
|
||||||
|
library, or may be loaded from a plugin. In some cases they're even fabricated from completely different systems (see
|
||||||
|
the LADSPA plugin). They are generally created from a GstElementFactory, which will be covered in another chapter, but
|
||||||
|
for the intrinsic types they can be created with specific functions.
|
||||||
|
|
||||||
|
Elements contains GstPads (also covered in another chapter), which are subsequently used to connect the Elements
|
||||||
|
together to form a pipeline capable of passing and processing data. They have a parent, which must be another Element.
|
||||||
|
This allows deeply nested pipelines, and the possibility of "black-box" meta-elements.
|
||||||
|
|
||||||
|
Name
|
||||||
|
----
|
||||||
|
|
||||||
|
All elements are named, and while they should ideally be unique in any given pipeline, the do not have to be. The only
|
||||||
|
guaranteed unique name for an element is its complete path in the object hierarchy. Functions are provided to set and
|
||||||
|
get the name of the element. _set_name() creates a local copy of the string passed. _get_name() returns the actual
|
||||||
|
element's pointer. Therefore, the argument to _set_name() is the responsibility of the caller to free if necessary,
|
||||||
|
but the return from _get_name() is definitely not to be messed with by the caller. Accordingly, _get_name() returns an
|
||||||
|
const gchar *.
|
||||||
|
|
||||||
|
Providing a new name to an element causes it to free its internal copy of the name and make a copy of the new name.
|
||||||
|
This means that you must consider the pointer returned by _get_name() to be short-lived. If you must make use of the
|
||||||
|
name beyond the immediate scope, it is suggested that you make yourself a copy of it. If you know for a fact neither
|
||||||
|
the pointer nor its contents will change, you may retain the original pointer. If you get odd results when using the
|
||||||
|
returned string, that's the first thing to check.
|
||||||
|
|
||||||
|
|
||||||
|
Pads
|
||||||
|
----
|
||||||
|
|
||||||
|
GstPads are the property of a given GstElement. They provide the connection capability, with allowing arbitrary
|
||||||
|
structure in the graph. For any Element but a source or sink, there will be at least 2 Pads owned by the Element.
|
||||||
|
These pads are stored in a single GList within the Element. Several counters are kept in order to allow quicker
|
||||||
|
determination of the type and properties of a given Element.
|
||||||
|
|
||||||
|
Pads may be added to an element with _add_pad. Retrieval is via _get_pad(), which operates on the name of the Pad (the
|
||||||
|
unique key). This means that all Pads owned by a given Element must have unique names (FIXME we don't verify this at
|
||||||
|
_add time). A pointer to the GList of pads may be obtained with _get_pad_list. As with the element's name,
|
||||||
|
precaution must be taken with all these pointers, as they are the same pointer that the Element uses internally. One
|
||||||
|
must be especially careful not to manipulate the list of pads.
|
||||||
|
|
||||||
|
gst_element_add_pad(element,pads):
|
||||||
|
Sets the element as the parent of the pad, then adds the pad to the element's list of pads, keeping the counts
|
||||||
|
of total, src, and sink pads up to date. Emits the "new_pad" signal with the pad as argument. Fails if either
|
||||||
|
the element or pad are either NULL or not what they claim to be. Should fail if the pad already has a parent.
|
||||||
|
Should fail if the pad is already owned by the element. Should fail if there's already a pad by that name in
|
||||||
|
the the list of pads.
|
||||||
|
|
||||||
|
pad = gst_element_get_pad(element,"padname"):
|
||||||
|
Searches through the list of pads
|
||||||
|
|
||||||
|
|
||||||
|
Ghost Pads
|
||||||
|
----------
|
||||||
|
|
||||||
|
|
||||||
|
State
|
||||||
|
-----
|
||||||
|
|
||||||
|
Elements use state to determine what the are capable of doing at any given moment. The states are defined as follows:
|
||||||
|
|
||||||
|
NULL No state is held for the element
|
||||||
|
READY Devices are open
|
||||||
|
PLAYING
|
||||||
|
PAUSED
|
42
docs/design/part-gstobject.txt
Normal file
42
docs/design/part-gstobject.txt
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
GstObject
|
||||||
|
=========
|
||||||
|
|
||||||
|
The base class for the entire GStreamer hierarchy is the GstObject. It is currently a bit of a hack caused by the
|
||||||
|
fact that GStreamer is built on top of GtkObject. GObject should help, if it's designed properly. Currently the
|
||||||
|
capabilities provided by GstObject are quite underutilized, this will be fixed with a refactoring of the
|
||||||
|
object system and a code cleanup at some point in the future. If nothing else, it serves as an easy check to see if a
|
||||||
|
given object belongs to GStreamer.
|
||||||
|
|
||||||
|
Parentage
|
||||||
|
---------
|
||||||
|
|
||||||
|
A pointer is available to store the current parent of the object. This one of the two fundamental requires for a
|
||||||
|
hierarchical system such as GStreamer (for the other, read up on GstBin). Three functions are provided: _set_parent(),
|
||||||
|
_get_parent(), and _unparent(). The third is required because there is an explicit check in _set_parent(): an object
|
||||||
|
must not already have a parent if you wish to set one. You must unparent the object first. This allows for new
|
||||||
|
additions later.
|
||||||
|
|
||||||
|
Refcounting
|
||||||
|
-----------
|
||||||
|
|
||||||
|
A reference count is kept for the object. When this is fully utilized, it will enable generic destruction of objects
|
||||||
|
by simply reducing the reference count to zero. GObject should provide these capabilities, however.
|
||||||
|
|
||||||
|
Locking
|
||||||
|
-------
|
||||||
|
|
||||||
|
The GstObject contains the necessary primitives to lock the object in a thread-safe manner. This will be used to
|
||||||
|
provide general thread-safety as needed. However, this lock is generic, i.e. it covers the whole object. Note that
|
||||||
|
this does *not* mean that no other thread can modify the object at the same time that the lock is held. It only means
|
||||||
|
that any two sections of code that obey the lock are guaranteed to not be running simultaneously.
|
||||||
|
|
||||||
|
This lock will ideally be used for parentage and refcounting, which is reasonable, since they are the only possible
|
||||||
|
things to protect in the GstObject.
|
||||||
|
|
||||||
|
Path Generation
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Due to the base nature of the GstObject, it becomes the only reasonable place to put this particular function
|
||||||
|
(_get_path_string). It will generate a string describing the parent hierarchy of a given GstObject. Currently it is
|
||||||
|
forced to use several child-class-specific functions, because we do not properly use the base capabilities (parentage,
|
||||||
|
etc.) of GstObject properly.
|
16
docs/design/part-standards.txt
Normal file
16
docs/design/part-standards.txt
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
Ownership of dynamic objects
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Any object-oriented system or language that doesn't have automatic garbage collection has many potential pitfalls as
|
||||||
|
far as the pointers go. Therefore, some standards must be adhered to as far as who owns what.
|
||||||
|
|
||||||
|
Strings:
|
||||||
|
Arguments passed into a function are owned by the caller, and the function will make a copy of the string for its own
|
||||||
|
internal use. The string should be const gchar *. Strings returned from a function remain the property of the
|
||||||
|
function called, and the caller must make a copy if it is to use the string for an extended duration.
|
||||||
|
|
||||||
|
Objects:
|
||||||
|
The ownership of an object during a function call depends on the type of function. If the function is simply returning
|
||||||
|
something from the object, such as _get_name(), the caller retains ownership. If the object passed is to be
|
||||||
|
manipulated in some way, it is generally the case that the function will take over the ownership. This should be
|
||||||
|
expressed as a reference increment on that object, but isn't in the general case (yet).
|
Loading…
Reference in a new issue