2016-12-05 21:12:24 +00:00
|
|
|
|
# GstObject
|
|
|
|
|
|
2016-12-24 07:22:45 +00:00
|
|
|
|
The base class for the entire GStreamer hierarchy is the `GstObject`.
|
2016-12-05 21:12:24 +00:00
|
|
|
|
|
|
|
|
|
## Parentage
|
|
|
|
|
|
|
|
|
|
A pointer is available to store the current parent of the object. This
|
|
|
|
|
is one of the two fundamental requirements for a hierarchical system
|
2016-12-24 07:22:45 +00:00
|
|
|
|
such as GStreamer (for the other, read up on `GstBin`). Three functions
|
2016-12-05 21:12:24 +00:00
|
|
|
|
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.
|
|
|
|
|
|
2016-12-24 07:22:45 +00:00
|
|
|
|
- `GstObject`’s that can be parented: `GstElement` (inside a bin) `GstPad` (inside an element)
|
2016-12-05 21:12:24 +00:00
|
|
|
|
|
|
|
|
|
## Naming
|
|
|
|
|
|
|
|
|
|
- names of objects cannot be changed when they are parented
|
|
|
|
|
- names of objects should be unique across parent
|
2016-12-24 07:22:45 +00:00
|
|
|
|
- `set_name()` can fail because of this
|
|
|
|
|
- as can `gst_element_add_pad()`/`gst_bin_add_element()`
|
|
|
|
|
- `gst_object_set_name()` only changes the object’s name
|
2016-12-05 21:12:24 +00:00
|
|
|
|
- objects also have a name_prefix that is used to prefix the object
|
|
|
|
|
name during debugging and identification
|
2016-12-24 07:22:45 +00:00
|
|
|
|
- there are object-specific `set_name()` which also set the
|
2016-12-05 21:12:24 +00:00
|
|
|
|
name_prefix on the object. This is useful for debugging purposes to
|
|
|
|
|
give the object a more identifiable name. Typically a parent will
|
2016-12-24 07:22:45 +00:00
|
|
|
|
call `_set_name_prefix()` on children, taking a lock on them to do
|
2016-12-05 21:12:24 +00:00
|
|
|
|
so.
|
|
|
|
|
|
|
|
|
|
## Locking
|
|
|
|
|
|
2016-12-24 07:22:45 +00:00
|
|
|
|
The `GstObject` contains the necessary primitives to lock the object in a
|
2016-12-05 21:12:24 +00:00
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
The object LOCK is a very lowlevel lock that should only be held to
|
|
|
|
|
access the object properties for short periods of code.
|
|
|
|
|
|
2016-12-24 07:22:45 +00:00
|
|
|
|
All members of the `GstObject` structure marked as `/**< public >**/ /*
|
2016-12-05 21:12:24 +00:00
|
|
|
|
with LOCK */` are protected by this lock. These members can only be
|
|
|
|
|
accessed for reading or writing while the lock is held. All members
|
|
|
|
|
should be copied or reffed if they are used after releasing the LOCK.
|
|
|
|
|
|
|
|
|
|
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. "The lock is voluntary and cooperative".
|
|
|
|
|
|
|
|
|
|
This lock will ideally be used for parentage, flags and naming, which is
|
|
|
|
|
reasonable, since they are the only possible things to protect in the
|
2016-12-24 07:22:45 +00:00
|
|
|
|
`GstObject`.
|
2016-12-05 21:12:24 +00:00
|
|
|
|
|
|
|
|
|
## Locking order
|
|
|
|
|
|
|
|
|
|
In parent-child situations the lock of the parent must always be taken
|
|
|
|
|
first before taking the lock of the child. It is NOT allowed to hold the
|
|
|
|
|
child lock before taking the parent lock.
|
|
|
|
|
|
|
|
|
|
This policy allows for parents to iterate their children and setting
|
|
|
|
|
properties on them.
|
|
|
|
|
|
|
|
|
|
Whenever a nested lock needs to be taken on objects not involved in a
|
|
|
|
|
parent-child relation (eg. pads), an explictic locking order has to be
|
|
|
|
|
defined.
|
|
|
|
|
|
|
|
|
|
## Path Generation
|
|
|
|
|
|
2016-12-24 07:22:45 +00:00
|
|
|
|
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`.
|
2016-12-05 21:12:24 +00:00
|
|
|
|
|
|
|
|
|
## Flags
|
|
|
|
|
|
|
|
|
|
Each object in the GStreamer object hierarchy can have flags associated
|
2016-12-24 07:22:45 +00:00
|
|
|
|
with it, which are used to describe its state or a features.
|