mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-19 23:06:49 +00:00
design: seeking: section breakdown, markup, readability and grammar fixes
This commit is contained in:
parent
8c08738547
commit
e509b30d95
1 changed files with 43 additions and 43 deletions
|
@ -1,11 +1,12 @@
|
|||
# Seeking
|
||||
|
||||
Seeking in GStreamer means configuring the pipeline for playback of the
|
||||
media between a certain start and stop time, called the playback
|
||||
segment. By default a pipeline will play from position 0 to the total
|
||||
duration of the media at a rate of 1.0.
|
||||
|
||||
A seek is performed by sending a seek event to the sink elements of a
|
||||
pipeline. Sending the seek event to a bin will by default forward the
|
||||
A seek is performed by sending a `SEEK` event to the sink elements of a
|
||||
pipeline. Sending the `SEEK` event to a bin will by default forward the
|
||||
event to all sinks in the bin.
|
||||
|
||||
When performing a seek, the start and stop values of the segment can be
|
||||
|
@ -20,7 +21,7 @@ Feedback of the seek operation can be immediately using the
|
|||
pipeline is discarded and playback starts from the new position
|
||||
immediately.
|
||||
|
||||
When the FLUSH flag is not set, the seek will be queued and executed as
|
||||
When the `FLUSH` flag is not set, the seek will be queued and executed as
|
||||
soon as possible, which might be after all queues are emptied.
|
||||
|
||||
Seeking can be performed in different formats such as time, frames or
|
||||
|
@ -39,7 +40,7 @@ Non segment seeking will make the pipeline emit EOS when the configured
|
|||
segment has been played.
|
||||
|
||||
Segment seeking (using the `GST_SEEK_FLAG_SEGMENT`) will not emit an
|
||||
EOS at the end of the playback segment but will post a SEGMENT_DONE
|
||||
EOS at the end of the playback segment but will post a `SEGMENT_DONE`
|
||||
message on the bus. This message is posted by the element driving the
|
||||
playback in the pipeline, typically a demuxer. After receiving the
|
||||
message, the application can reconnect the pipeline or issue other seek
|
||||
|
@ -63,7 +64,7 @@ consumption is more important than accurately producing all frames.
|
|||
|
||||
## Generating seeking events
|
||||
|
||||
A seek event is created with `gst_event_new_seek ()`.
|
||||
A seek event is created with `gst_event_new_seek()`.
|
||||
|
||||
## Seeking variants
|
||||
|
||||
|
@ -81,8 +82,8 @@ media is immediately played after the seek call returns.
|
|||
This seek type is typically performed after issuing segment seeks to
|
||||
finish the playback of the pipeline.
|
||||
|
||||
Performing a non-flushing seek in a PAUSED pipeline blocks until the
|
||||
pipeline is set to playing again since all data passing is blocked in
|
||||
Performing a non-flushing seek in a `PAUSED` pipeline blocks until the
|
||||
pipeline is set to playing again, since all data passing is blocked in
|
||||
the prerolled sinks.
|
||||
|
||||
### segment seeking with FLUSH
|
||||
|
@ -93,14 +94,13 @@ This seek is typically performed when starting seamless looping.
|
|||
|
||||
This seek is typically performed when continuing seamless looping.
|
||||
|
||||
Demuxer/parser behaviour and `SEEK_FLAG_KEY_UNIT` and
|
||||
`SEEK_FLAG_ACCURATE`
|
||||
## `KEY_UNIT` and `ACCURATE` flags
|
||||
|
||||
This section aims to explain the behaviour expected by an element with
|
||||
regard to the KEY_UNIT and ACCURATE seek flags using the example of a
|
||||
parser or demuxer.
|
||||
regard to the `KEY_UNIT` and `ACCURATE` seek flags, using a parser
|
||||
or demuxer as an example.
|
||||
|
||||
#### DEFAULT BEHAVIOUR:
|
||||
### DEFAULT BEHAVIOUR:
|
||||
|
||||
When a seek to a certain position is requested, the demuxer/parser will
|
||||
do two things (ignoring flushing and segment seeks, and simplified for
|
||||
|
@ -114,17 +114,17 @@ To ensure that the data corresponding to the requested seek position can
|
|||
actually be decoded, a demuxer or parser needs to start pushing data
|
||||
from a keyframe/keyunit at or before the requested seek position.
|
||||
|
||||
Unless requested differently (via the KEY_UNIT flag), the start of the
|
||||
Unless requested differently (via the `KEY_UNIT` flag), the start of the
|
||||
segment event should be the requested seek position.
|
||||
|
||||
So by default a demuxer/parser will then start pushing data from
|
||||
position DATA and send a segment event with start position SEG_START,
|
||||
and DATA ⇐ SEG_START.
|
||||
position DATA and send a segment event with start position `SEG_START`,
|
||||
and `DATA ⇐ SEG_START`.
|
||||
|
||||
If DATA < SEG_START, a well-behaved video decoder will start decoding
|
||||
If `DATA < SEG_START`, a well-behaved video decoder will start decoding
|
||||
frames from DATA, but take into account the segment configured by the
|
||||
demuxer via the segment event, and only actually output decoded video
|
||||
frames from SEG_START onwards, dropping all decoded frames that are
|
||||
frames from `SEG_START` onwards, dropping all decoded frames that are
|
||||
before the segment start and adjusting the timestamp/duration of the
|
||||
buffer that overlaps the segment start ("clipping"). A
|
||||
not-so-well-behaved video decoder will start decoding frames from DATA
|
||||
|
@ -132,52 +132,52 @@ and push decoded video frames out starting from position DATA, in which
|
|||
case the frames that are before the configured segment start will
|
||||
usually be dropped/clipped downstream (e.g. by the video sink).
|
||||
|
||||
#### GST_SEEK_FLAG_KEY_UNIT:
|
||||
### `GST_SEEK_FLAG_KEY_UNIT`
|
||||
|
||||
If the KEY_UNIT flag is specified, the demuxer/parser should adjust the
|
||||
If the `KEY_UNIT` flag is specified, the demuxer/parser should adjust the
|
||||
segment start to the position of the key frame closest to the requested
|
||||
seek position and then start pushing out data from there. The nearest
|
||||
key frame may be before or after the requested seek position, but many
|
||||
implementations will only look for the closest keyframe before the
|
||||
requested position.
|
||||
|
||||
Most media players and thumbnailers do (and should be doing) KEY_UNIT
|
||||
Most media players and thumbnailers do (and should be doing) `KEY_UNIT`
|
||||
seeks by default, for performance reasons, to ensure almost-instant
|
||||
responsiveness when scrubbing (dragging the seek slider in PAUSED or
|
||||
PLAYING mode). This works well for most media, but results in suboptimal
|
||||
responsiveness when scrubbing (dragging the seek slider in `PAUSED` or
|
||||
`PLAYING` mode). This works well for most media, but results in suboptimal
|
||||
behaviour for a small number of *odd* files (e.g. files that only have
|
||||
one keyframe at the very beginning, or only a few keyframes throughout
|
||||
the entire stream). At the time of writing, a solution for this still
|
||||
needs to be found, but could be implemented demuxer/parser-side, e.g.
|
||||
make demuxers/parsers ignore the KEY_UNIT flag if the position
|
||||
make demuxers/parsers ignore the `KEY_UNIT` flag if the position
|
||||
adjustment would be larger than 1/10th of the duration or somesuch.
|
||||
|
||||
Flags can be used to influence snapping direction for those cases where
|
||||
it matters. SNAP_BEFORE will select the preceding position to the seek
|
||||
target, and SNAP_AFTER will select the following one. If both flags are
|
||||
it matters. `SNAP_BEFORE` will select the preceding position to the seek
|
||||
target, and `SNAP_AFTER` will select the following one. If both flags are
|
||||
set, the nearest one to the seek target will be used. If none of these
|
||||
flags are set, the seeking implemention is free to select whichever it
|
||||
wants.
|
||||
|
||||
#### Summary:
|
||||
|
||||
- if the KEY_UNIT flag is **not** specified, the demuxer/parser
|
||||
- if the `KEY_UNIT` flag is **not** specified, the demuxer/parser
|
||||
should start pushing data from a key unit preceding the seek
|
||||
position (or from the seek position if that falls on a key unit),
|
||||
and the start of the new segment should be the requested seek
|
||||
position.
|
||||
|
||||
- if the KEY_UNIT flag is specified, the demuxer/parser should start
|
||||
- if the `KEY_UNIT` flag is specified, the demuxer/parser should start
|
||||
pushing data from the key unit nearest the seek position (or from
|
||||
the seek position if that falls on a key unit), and the start of the
|
||||
new segment should be adjusted to the position of that key unit
|
||||
which was nearest the requested seek position (ie. the new segment
|
||||
start should be the position from which data is pushed).
|
||||
|
||||
### GST_SEEK_FLAG_ACCURATE:
|
||||
### `GST_SEEK_FLAG_ACCURATE`
|
||||
|
||||
If the ACCURATE flag is specified in a seek request, the demuxer/parser
|
||||
is asked to do whatever it takes (!) to make sure that the position
|
||||
If the `ACCURATE` flag is specified in a seek request, the demuxer/parser
|
||||
is asked to do whatever it takes (!) to make sure the position
|
||||
seeked to is accurate in relation to the beginning of the stream. This
|
||||
means that it is not acceptable to just approximate the position (e.g.
|
||||
using an average bitrate). The achieved position must be exact. In the
|
||||
|
@ -185,30 +185,30 @@ worst case, the demuxer or parser needs to push data from the beginning
|
|||
of the file and let downstream clip everything before the requested
|
||||
segment start.
|
||||
|
||||
The ACCURATE flag does not affect what the segment start should be in
|
||||
relation to the requested seek position. Only the KEY_UNIT flag (or its
|
||||
The `ACCURATE` flag does not affect what the segment start should be in
|
||||
relation to the requested seek position. Only the `KEY_UNIT` flag (or its
|
||||
absence) has any effect on that.
|
||||
|
||||
Video editors and frame-stepping applications usually use the ACCURATE
|
||||
Video editors and frame-stepping applications usually use the `ACCURATE`
|
||||
flag.
|
||||
|
||||
#### Summary:
|
||||
|
||||
- if the ACCURATE flag is **not** specified, it is up to the
|
||||
demuxer/parser to decide how exact the seek should be. If the flag
|
||||
is not specified, the expectation is that the demuxer/parser does a
|
||||
- if the `ACCURATE` flag is **not** specified, it is up to the
|
||||
demuxer/parser to decide how exact the seek should be. In this case,
|
||||
the expectation is that the demuxer/parser does a
|
||||
resonable best effort attempt, trading speed for accuracy. In the
|
||||
absence of an index, the seek position may be approximated.
|
||||
|
||||
- if the ACCURATE flag is specified, absolute accuracy is required,
|
||||
- if the `ACCURATE` flag **is** specified, absolute accuracy is required,
|
||||
and speed is of no concern. It is not acceptable to just approximate
|
||||
the seek position in that case.
|
||||
|
||||
- the ACCURATE flag does not imply that the segment starts at the
|
||||
- the `ACCURATE` flag does not imply that the segment starts at the
|
||||
requested seek position or should be adjusted to the nearest
|
||||
keyframe, only the KEY_UNIT flag determines that.
|
||||
keyframe, only the `KEY_UNIT` flag determines that.
|
||||
|
||||
### ACCURATE and KEY_UNIT combinations:
|
||||
### `ACCURATE` and `KEY_UNIT` combinations:
|
||||
|
||||
All combinations of these two flags are valid:
|
||||
|
||||
|
@ -216,14 +216,14 @@ All combinations of these two flags are valid:
|
|||
from preceding key frame (or earlier), feel free to approximate the
|
||||
seek position
|
||||
|
||||
- only KEY_UNIT specified: segment starts from position of nearest
|
||||
- only `KEY_UNIT` specified: segment starts from position of nearest
|
||||
keyframe, send data from nearest keyframe, feel free to approximate
|
||||
the seek position
|
||||
|
||||
- only ACCURATE specified: segment starts at seek position, send data
|
||||
- only `ACCURATE` specified: segment starts at seek position, send data
|
||||
from preceding key frame (or earlier), do not approximate the seek
|
||||
position under any circumstances
|
||||
|
||||
- ACCURATE | KEY_UNIT specified: segment starts from position of
|
||||
- `ACCURATE | KEY_UNIT` specified: segment starts from position of
|
||||
nearest keyframe, send data from nearest key frame, do not
|
||||
approximate the seek position under any circumstances
|
||||
|
|
Loading…
Reference in a new issue