# 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, including:
    - `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` event 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. (See also
   [Segments](additional/design/segments.md))
   - marks valid buffer timestamp range (start, stop)
   - marks `stream_time` of buffers (time). This is the stream time of buffers
     with a timestamp of `S.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 [trickmodes](additional/design/trickmodes.md))
   - 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` (S). Buffers
     outside the segment range should be dropped or clipped.

   - `running_time`: For each buffer, a monotonically increasing value that can
     be used to synchronize against the clock (See also
     [synchronisation](additional/design/synchronisation.md)).

     ``` c
     if (S.rate > 0.0)
       running_time = (B.timestamp - S.start) / ABS (S.rate) + S.base;
     else
       running_time = (S.stop - B.timestamp) / ABS (S.rate) + S.base;
     ```

   - `stream_time`: The current position in the stream, between 0 and duration.

     ``` c
     stream_time = (B.timestamp - S.start) * ABS (S.applied_rate) + S.time;
     ```


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.