Streams
-------

  This document describes the objects that are passed from element to
  element in the streaming thread.


Stream objects
~~~~~~~~~~~~~~

The following objects are to be expected in the streaming thread:

 - events
    - STREAM_START      (START)
    - SEGMENT           (SEGMENT)
    - EOS             * (EOS)
    - TAG               (T)
 - buffers            * (B)

Objects marked with * need to be synchronised to the clock in sinks
and live sources.


Typical stream
~~~~~~~~~~~~~~

 A typical stream starts with a stream start event that marks the
 start of the stream, followed by a segment event that marks the
 buffer timestamp range. After that buffers are sent one after the
 other. After the last buffer an EOS marks the end of the stream. No
 more buffers are to be processed after the EOS event.

  +-----+-------+ +-++-+     +-+ +---+
  |START|SEGMENT| |B||B| ... |B| |EOS|
  +-----+-------+ +-++-+     +-+ +---+

  1) STREAM_START
     - marks the start of a stream; unlike the SEGMENT event, there
       will be no STREAM_START event after flushing seeks.

  2) SEGMENT, rate, start/stop, time
     - marks valid buffer timestamp range (start, stop)
     - marks stream_time of buffers (time). This is the stream time of buffers
       with a timestamp of NS.start.
     - marks playback rate (rate). This is the required playback rate.
     - marks applied rate (applied_rate). This is the already applied playback
       rate. (See also part-trickmodes.txt)
     - marks running_time of buffers. This is the time used to synchronize
       against the clock.

  3) N buffers
     - displayable buffers are between start/stop of the SEGMENT. Buffers
       outside the segment range should be dropped or clipped.

     - running_time: 
     
         if (NS.rate > 0.0)
           running_time = (B.timestamp - NS.start) / NS.abs_rate + NS.accum
         else
           running_time = (NS.stop - B.timestamp) / NS.abs_rate + NS.accum

        * a monotonically increasing value that can be used to synchronize 
	  against the clock (See also part-synchronisation.txt).

     - stream_time:

         stream_time = (B.timestamp - NS.start) * NS.abs_applied_rate + NS.time

        * current position in stream between 0 and duration.

  4) EOS
     - marks the end of data, nothing is to be expected after EOS, elements
       should refuse more data and return GST_FLOW_EOS. A FLUSH_STOP
       event clears the EOS state of an element.


Elements
~~~~~~~~

These events are generated typically either by the GstBaseSrc class for
sources operating in push mode, or by a parser/demuxer operating in pull-mode
and pushing parsed/demuxed data downstream.
