From f3756af07ba920e5d734e217bae2982c399452a3 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Tue, 9 Dec 2014 16:28:56 +1100 Subject: [PATCH] segment: Add new skip flags for clarifying trick mode playback. Add GST_SEEK_FLAG_TRICKMODE_KEY_UNITS and GST_SEEK_FLAG_TRICKMODE_NO_AUDIO, and rename GST_SEEK_FLAG_SKIP to GST_SEEK_FLAG_TRICKMODE (with backwards compat define). Do the same for the corresponding SEGMENT flags. https://bugzilla.gnome.org/show_bug.cgi?id=735666 --- gst/gstsegment.c | 8 ++++++-- gst/gstsegment.h | 42 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/gst/gstsegment.c b/gst/gstsegment.c index 3c4081b609..fc52363f81 100644 --- a/gst/gstsegment.c +++ b/gst/gstsegment.c @@ -340,10 +340,14 @@ gst_segment_do_seek (GstSegment * segment, gdouble rate, segment->flags = GST_SEGMENT_FLAG_NONE; if ((flags & GST_SEEK_FLAG_FLUSH) != 0) segment->flags |= GST_SEGMENT_FLAG_RESET; - if ((flags & GST_SEEK_FLAG_SKIP) != 0) - segment->flags |= GST_SEGMENT_FLAG_SKIP; + if ((flags & GST_SEEK_FLAG_TRICKMODE) != 0) + segment->flags |= GST_SEGMENT_FLAG_TRICKMODE; if ((flags & GST_SEEK_FLAG_SEGMENT) != 0) segment->flags |= GST_SEGMENT_FLAG_SEGMENT; + if ((flags & GST_SEEK_FLAG_TRICKMODE_KEY_UNITS) != 0) + segment->flags |= GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS; + if ((flags & GST_SEEK_FLAG_TRICKMODE_NO_AUDIO) != 0) + segment->flags |= GST_SEGMENT_FLAG_TRICKMODE_NO_AUDIO; segment->rate = rate; segment->applied_rate = 1.0; diff --git a/gst/gstsegment.h b/gst/gstsegment.h index c9ec1e479e..4787e49fc1 100644 --- a/gst/gstsegment.h +++ b/gst/gstsegment.h @@ -56,9 +56,9 @@ typedef enum { * @GST_SEEK_FLAG_KEY_UNIT: seek to the nearest keyframe. This might be * faster but less accurate. * @GST_SEEK_FLAG_SEGMENT: perform a segment seek. - * @GST_SEEK_FLAG_SKIP: when doing fast forward or fast reverse playback, allow + * @GST_SEEK_FLAG_TRICKMODE: when doing fast forward or fast reverse playback, allow * elements to skip frames instead of generating all - * frames. + * frames. (Since: 1.6) * @GST_SEEK_FLAG_SNAP_BEFORE: go to a location before the requested position, * if KEY_UNIT this means the keyframe at or before the * requested position the one at or before the seek target. @@ -69,6 +69,15 @@ typedef enum { * if KEY_UNIT this means the keyframe closest to the * requested position, if both keyframes are at an equal * distance, behaves like SNAP_BEFORE. + * @GST_SEEK_FLAG_TRICKMODE_KEY_UNITS: when doing fast forward or fast reverse + * playback, request that elements only decode keyframes + * and skip all other content, for formats that have + * keyframes. (Since: 1.6) + * @GST_SEEK_FLAG_TRICKMODE_NO_AUDIO: when doing fast forward or fast reverse + * playback, request that audio decoder elements skip + * decoding and output only gap events or silence. (Since: 1.6) + * @GST_SEEK_FLAG_SKIP: Deprecated backward compatibility flag, replaced + * by @GST_SEEK_FLAG_TRICKMODE * * Flags to be used with gst_element_seek() or gst_event_new_seek(). All flags * can be used together. @@ -88,10 +97,15 @@ typedef enum { * looping or simple linear editing. * * When doing fast forward (rate > 1.0) or fast reverse (rate < -1.0) trickmode - * playback, the @GST_SEEK_FLAG_SKIP flag can be used to instruct decoders + * playback, the @GST_SEEK_FLAG_TRICKMODE flag can be used to instruct decoders * and demuxers to adjust the playback rate by skipping frames. This can improve * performance and decrease CPU usage because not all frames need to be decoded. * + * Beyond that, the @GST_SEEK_FLAG_TRICKMODE_KEY_UNITS flag can be used to + * request that decoders skip all frames except key units, and + * @GST_SEEK_FLAG_TRICKMODE_NO_AUDIO flags can be used to request that audio + * decoders do no decoding at all, and simple output silence. + * * The @GST_SEEK_FLAG_SNAP_BEFORE flag can be used to snap to the previous * relevant location, and the @GST_SEEK_FLAG_SNAP_AFTER flag can be used to * select the next relevant location. If KEY_UNIT is specified, the relevant @@ -112,11 +126,16 @@ typedef enum { GST_SEEK_FLAG_ACCURATE = (1 << 1), GST_SEEK_FLAG_KEY_UNIT = (1 << 2), GST_SEEK_FLAG_SEGMENT = (1 << 3), + GST_SEEK_FLAG_TRICKMODE = (1 << 4), + /* FIXME 2.0: Remove _SKIP flag, + * which was kept for backward compat when _TRICKMODE was added */ GST_SEEK_FLAG_SKIP = (1 << 4), GST_SEEK_FLAG_SNAP_BEFORE = (1 << 5), GST_SEEK_FLAG_SNAP_AFTER = (1 << 6), GST_SEEK_FLAG_SNAP_NEAREST = GST_SEEK_FLAG_SNAP_BEFORE | GST_SEEK_FLAG_SNAP_AFTER, /* Careful to restart next flag with 1<<7 here */ + GST_SEEK_FLAG_TRICKMODE_KEY_UNITS = (1 << 7), + GST_SEEK_FLAG_TRICKMODE_NO_AUDIO = (1 << 8), } GstSeekFlags; /** @@ -124,8 +143,14 @@ typedef enum { * @GST_SEGMENT_FLAG_NONE: no flags * @GST_SEGMENT_FLAG_RESET: reset the pipeline running_time to the segment * running_time - * @GST_SEGMENT_FLAG_SKIP: perform skip playback + * @GST_SEGMENT_FLAG_TRICKMODE: perform skip playback (Since: 1.6) * @GST_SEGMENT_FLAG_SEGMENT: send SEGMENT_DONE instead of EOS + * @GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS: Decode only keyframes, where + * possible (Since: 1.6) + * @GST_SEGMENT_FLAG_TRICKMODE_NO_AUDIO: Do not decode any audio, where + * possible (Since: 1.6) + * @GST_SEGMENT_FLAG_SKIP: Deprecated backward compatibility flag, replaced + * by @GST_SEGMENT_FLAG_TRICKMODE * * Flags for the GstSegment structure. Currently mapped to the corresponding * values of the seek flags. @@ -134,8 +159,13 @@ typedef enum { typedef enum { /*< flags >*/ GST_SEGMENT_FLAG_NONE = GST_SEEK_FLAG_NONE, GST_SEGMENT_FLAG_RESET = GST_SEEK_FLAG_FLUSH, - GST_SEGMENT_FLAG_SKIP = GST_SEEK_FLAG_SKIP, - GST_SEGMENT_FLAG_SEGMENT = GST_SEEK_FLAG_SEGMENT + GST_SEGMENT_FLAG_TRICKMODE = GST_SEEK_FLAG_TRICKMODE, + /* FIXME 2.0: Remove _SKIP flag, + * which was kept for backward compat when _TRICKMODE was added */ + GST_SEGMENT_FLAG_SKIP = GST_SEEK_FLAG_TRICKMODE, + GST_SEGMENT_FLAG_SEGMENT = GST_SEEK_FLAG_SEGMENT, + GST_SEGMENT_FLAG_TRICKMODE_KEY_UNITS = GST_SEEK_FLAG_TRICKMODE_KEY_UNITS, + GST_SEGMENT_FLAG_TRICKMODE_NO_AUDIO = GST_SEEK_FLAG_TRICKMODE_NO_AUDIO } GstSegmentFlags; /**