blob: 2c6e704f7a214463b498789c96d71e97532d28db [file] [log] [blame]
OUTDATED
--------
GST State Bits and Transition Rules (graph to follow)
-----------------------------------
These are the 'new' state bits and what they mean.
What the state bits are:
GST_STATE_COMPLETE: if the element has enough data, but is not in any kind
of running or explicitely stopped state. ready to be used.
GST_STATE_RUNNING: this is the normal state of the pipeline, where data
goes all the way through the pipeline normally.
GST_STATE_DISCOVERY: anything the element does in this state must be reset
after discovery. any data read from sync source must be cached.
GST_STATE_PREROLL: not a lot different from PLAYING, except sinks don't
render what they're getting. useful for elements that require
data to get in sync, such as an MPEG video decoder that needs
IBBPBB before starting at the next P.
Basic transition rules:
Completeness is based on the element having enough information to actually
do something. GST_STATE_COMPLETE is required for any other state to be
valid, though the only invariant is that you can't be RUNNING unless
you're COMPLETE. In fact, AFAICT, that's the *only* invariant.
The element is entirely in control of this bit at all times. There is no
way to externally change this bit except by changing the state of the
element in such a way as to effect a change.
|= GST_STATE_COMPLETE
setting whatever the last bit of info the element was looking for
(gst_object_set)
&= ~GST_STATE_COMPLETE
changing anything that invalidates the complete state of the element
Whether the element is running or not, on the other hand, is almost
entirely out of the hands of the individual element. This is generally
turned on by way of gst_element_run() as called by the parent (ultimately
by the Pipeline), which happens to optionally call a function private to
the element to prepare it. As per docs/random/gboolean, very likely this
function should return a TRUE/FALSE.
Generally, I think if there is no such function, the generic element code
should go ahead and set the state, and trigger the state_changed signal,
returning TRUE. If there is a function, call it. If it returns TRUE,
fire off the signal (since the signal is actually an Element signal
anyway, why eat another function call?). Return the result regardless.
|= GST_STATE_RUNNING
starting up the pipeline with gst_pipeline_start
~= ~GST_STATE_RUNNING
stopping the pipeline with gst_pipeline_stop, or some error state
gst_pipeline_start() simply calls the gst_element_start() function on each
of the elements in it. This sets the RUNNING bit of each element, and for
GstBin's it loops through that list. gst_pipeline_start() is just a
special case version of gst_bin_start(). All start() functions are
GstElementClass functions, meaning you can start any element the same way.
The pipeline can be stopped the same way, but more likely the pipeline
will be stopped due to some stoppage condition, such as EOF on the source
file, or the parser being told to stop the stream. In the EOF case, it
would turn its RUNNING bit off, then call the stop() class function on its
parent. This would trigger an up-hill, breath-first traversal of the
whole graph. Alternately, if each element lists its uber-parent (the
Pipeline) it can simply inform the pipeline directly, causing a
depth-first traversal just like the start() case.