| OUTDATED |
| -------- |
| |
| EOS as implemented on Jan 21 2001: |
| |
| 1) terminology |
| -------------- |
| |
| EOS: end of stream. The problem we are trying to solve here is |
| detecting when the processing of a piece of media data has |
| ended. |
| |
| This problem can get complicated because the pipeline might |
| contain an arbitrary number of threads and other ASYNC and |
| DECOUPLED elements like queues. We are trying to solve the |
| obvious cases first by making some assumptions (see limitations) |
| in order to avoid the exponentially growing complexity. |
| |
| The trick is to detect when all the elements/subbins/threads |
| and done processing their data. This involves monitoring the |
| threads and elements. |
| |
| Catching the EOS signals from an element is easy. We are focusing |
| here on the EOS signal propagation to the manager bin up to the |
| toplevel bin. |
| |
| EOS call: the pads have a method gst_pad_set_eos () that will |
| be called by an element that cannot send any more data on the |
| pad. |
| |
| EOS signals: elements fires the EOS signal when all it's pads are in |
| EOS. |
| |
| chains: at plan generation, the bin will find the elements it has to |
| manage. The elements that are managed together are called a chain. |
| This is typically a set of elements that need input from their |
| peer element before they can output data. When one of those elements |
| cannot provide more data and goes into EOS, the other elements |
| are basically worthless and there is no point in trying to schedule |
| them anymore. |
| |
| Chains are typically broken up on DECOUPLED elements. Those elements |
| have no clear relation between their input/output behaviour, like |
| the queue. |
| |
| EOS denial: An element can deny an EOS call by returning FALSE on the |
| overridden EOS call. This behaviour is typical for an element that |
| performs _get_region on its sinkpad and basically does not care |
| about the EOS because it knows it will pull a specific region |
| anyway. |
| |
| |
| 2) EOS implementation |
| --------------------- |
| |
| EOS is currently implemented by selectively disabling scheduling of |
| the chains. This procedure continues untill a bin/thread has no more |
| chains left to schedule, at which point it will fire the EOS signal. |
| |
| A gboolean was added to the chain structure to indicate if this chain |
| need scheduling. Initially this will gboolean will be set to TRUE. |
| |
| the gst_bin_iterate_func will only schedule those chains that have |
| their need_scheduling flag to TRUE. |
| |
| All elements are treated as potential EOS signal providers. When we add |
| the elements to a chain, we attach the eos signal to them and hand |
| the chain they were added to as an argument to the signal handler. |
| When an element goes to EOS, we mark the chain as need_scheduling=FALSE. |
| This removes the chain from the scheduling loop. |
| |
| Since plain bins in bins are flattened during the chain creation, we do |
| not need to worry about the bin EOS. |
| |
| Other elements that do their own managing (like threads) are treated |
| differently, they are added to a list of EOS-providers. Since they |
| have their own chains and use the same iterate_func, they will eventually |
| fire EOS on their own when they run out of schedulable chains. |
| The EOS signal of the EOS providers is caught by the parent bin which |
| will then remove the bin from the list of possible EOS providers. |
| |
| Combining the EOS providers list and the chains, the bin will fire |
| and EOS signal when 1) it has no more chains to schedule, 2) all its |
| EOS providers have signaled EOS. |
| |
| 3) queue EOS handling |
| --------------------- |
| |
| The queue overrides the eos call and performs the following: |
| |
| Set the sinkpad to EOS and signal its internal g_cond to unlock any |
| waiting threads on the srcpad. |
| |
| The scrpad _get function performs the EOS call when no more buffers |
| are queued and the sinkpad is in EOS. This causes the EOS call to |
| propagate downstream and effectively causes all chains and threads |
| to become EOS. |
| |
| |
| 4) limitations |
| -------------- |
| |
| We assume a chain is a single schedualable entity. Rescheduling of |
| the bins and chains are not performed. |
| |
| No provisions for changing the state of the elements in EOS, although |
| this probably isn't hard to do. |
| |
| No provisions for undoing the EOS state. This is probably related to |
| the state change, where a chain should become schedulable again when the |
| element goes back to the PLAYING state. |
| |
| |