| 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. |