| DRAFT Sparse Streams |
| -------------------- |
| |
| Introduction |
| ~~~~~~~~~~~~ |
| |
| In 0.8, there was some support for Sparse Streams through the use of |
| FILLER events. These were used to mark gaps between buffers so that downstream |
| elements could know not to expect any more data for that gap. |
| |
| In 0.10, segment information conveyed through SEGMENT events can be used |
| for the same purpose. |
| |
| In 1.0, there is a GAP event that works in a similar fashion as the FILLER |
| event in 0.8. |
| |
| Use cases |
| ~~~~~~~~~ |
| |
| 1) Sub-title streams |
| Sub-title information from muxed formats such as Matroska or MPEG consist of |
| irregular buffers spaced far apart compared to the other streams |
| (audio and video). Since these usually only appear when someone speaks or |
| some other action in the video/audio needs describing, they can be anywhere |
| from 1-2 seconds to several minutes apart. |
| |
| Downstream elements that want to mix sub-titles and video (and muxers) |
| have no way of knowing whether to process a video packet or wait a moment |
| for a corresponding sub-title to be delivered on another pad. |
| |
| 2) Still frame/menu support |
| In DVDs (and other formats), there are still-frame regions where the current |
| video frame should be retained and no audio played for a period. In DVD, |
| these are described either as a fixed duration, or infinite duration still |
| frame. |
| |
| 3) Avoiding processing silence from audio generators |
| Imagine a source that from time to time produces empty buffers (silence |
| or blank images). If the pipeline has many elements next, it is better to |
| optimise the obsolete data processing in this case. Examples for such sources |
| are sound-generators (simsyn in gst-buzztard) or a source in a voip |
| application that uses noise-gating (to save bandwith). |
| |
| Details |
| ~~~~~~~ |
| |
| 1) Sub-title streams |
| The main requirement here is to avoid stalling the pipeline between sub-title |
| packets, and is effectively updating the minimum-timestamp for that stream. |
| |
| A demuxer can do this by sending an 'update' SEGMENT with a new start time |
| to the subtitle pad. For example, every time the SCR in MPEG data |
| advances more than 0.5 seconds, the MPEG demuxer can issue a SEGMENT with |
| (update=TRUE, start=SCR ). Downstream elements can then be aware not to |
| expect any data older than the new start time. |
| |
| The same holds true for any element that knows the current position in the |
| stream - once the element knows that there is no more data to be presented |
| until time 'n' it can advance the start time of the current segment to 'n'. |
| |
| This technique can also be used, for example, to represent a stream of |
| MIDI events spaced to a clock period. When there is no event present for |
| a clock time, a SEGMENT update can be sent in its place. |
| |
| 2) Still frame/menu support |
| Still frames in DVD menus are not the same, in that they do not introduce |
| a gap in the timestamps of the data. Instead, they represent a pause in the |
| presentation of a stream. Correctly performing the wait requires some |
| synchronisation with downstream elements. |
| |
| In this scenario, an upstream element that wants to execute a still frame |
| performs the following steps: |
| |
| * Send all data before the still frame wait |
| * Send a DRAIN event to ensure that all data has been played downstream. |
| * wait on the clock for the required duration, possibly interrupting |
| if necessary due to an intervening activity (such as a user navigation) |
| * FLUSH the pipeline using a normal flush sequence (FLUSH_START, |
| chain-lock, FLUSH_STOP) |
| * Send a SEGMENT to restart playback with the next timestamp in the |
| stream. |
| |
| The upstream element performing the wait must only do so when in the PLAYING |
| state. During PAUSED, the clock will not be running, and may not even have |
| been distributed to the element yet. |
| |
| DRAIN is a new event that will block on a src pad until all data downstream |
| has been played out. |
| |
| Flushing after completing the still wait is to ensure that data after the wait |
| is played correctly. Without it, sinks will consider the first buffers |
| (x seconds, where x is the duration of the wait that occurred) to be |
| arriving late at the sink, and they will be discarded instead of played. |
| |
| 3) For audio, 3) is the same case as 1) - there is a 'gap' in the audio data |
| that needs to be presented, and this can be done by sending a SEGMENT |
| update that moves the start time of the segment to the next timestamp when |
| data will be sent. |
| |
| For video, however it is slightly different. Video frames are typically |
| treated at the moment as continuing to be displayed after their indicated |
| duration if no new frame arrives. In 3), it is desired to display a blank |
| frame instead, in which case at least one blank frame should be sent before |
| updating the start time of the segment. |
| |
| |