diff options
author | Sebastian Dröge <sebastian@centricular.com> | 2015-09-23 20:30:21 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2015-09-25 23:53:47 +0200 |
commit | 155c8fc6a6af05c6f08cde5133cff79350be8243 (patch) | |
tree | 7866e3d5014fbc37ce0a536447746571f1a3b173 | |
parent | f501188191c63bc531437d6311f46a9a7d535f6b (diff) |
asfdemux: Only change segment start to a keyframe for KEYUNIT seeks
Not for accurate seeks, which should accurately start at the requested
position.
https://bugzilla.gnome.org/show_bug.cgi?id=755469
-rw-r--r-- | gst/asfdemux/gstasfdemux.c | 22 | ||||
-rw-r--r-- | gst/asfdemux/gstasfdemux.h | 2 |
2 files changed, 12 insertions, 12 deletions
diff --git a/gst/asfdemux/gstasfdemux.c b/gst/asfdemux/gstasfdemux.c index 2a92ac22f3..cdd1eb4869 100644 --- a/gst/asfdemux/gstasfdemux.c +++ b/gst/asfdemux/gstasfdemux.c @@ -274,7 +274,7 @@ gst_asf_demux_reset (GstASFDemux * demux, gboolean chain_reset) demux->need_newsegment = TRUE; demux->segment_seqnum = 0; demux->segment_running = FALSE; - demux->accurate = FALSE; + demux->keyunit_sync = FALSE; demux->metadata = gst_caps_new_empty (); demux->global_metadata = gst_structure_new_empty ("metadata"); demux->data_size = 0; @@ -622,7 +622,7 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event) GstSeekType cur_type, stop_type; GstFormat format; gboolean only_need_update; - gboolean keyunit_sync, after, before, next; + gboolean accurate, after, before, next; gboolean flush; gdouble rate; gint64 cur, stop; @@ -663,9 +663,9 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event) seqnum = gst_event_get_seqnum (event); flush = ((flags & GST_SEEK_FLAG_FLUSH) == GST_SEEK_FLAG_FLUSH); - demux->accurate = - ((flags & GST_SEEK_FLAG_ACCURATE) == GST_SEEK_FLAG_ACCURATE); - keyunit_sync = ((flags & GST_SEEK_FLAG_KEY_UNIT) == GST_SEEK_FLAG_KEY_UNIT); + accurate = ((flags & GST_SEEK_FLAG_ACCURATE) == GST_SEEK_FLAG_ACCURATE); + demux->keyunit_sync = + ((flags & GST_SEEK_FLAG_KEY_UNIT) == GST_SEEK_FLAG_KEY_UNIT); after = ((flags & GST_SEEK_FLAG_SNAP_AFTER) == GST_SEEK_FLAG_SNAP_AFTER); before = ((flags & GST_SEEK_FLAG_SNAP_BEFORE) == GST_SEEK_FLAG_SNAP_BEFORE); next = after && !before; @@ -765,7 +765,7 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event) * the hope of hitting a keyframe and let the sinks throw away the stuff * before the segment start. For audio-only this is unnecessary as every * frame is 'key'. */ - if (flush && (demux->accurate || (keyunit_sync && !next)) + if (flush && (accurate || (demux->keyunit_sync && !next)) && demux->num_video_streams > 0) { seek_time -= 5 * GST_SECOND; if (seek_time < 0) @@ -779,7 +779,7 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event) packet = demux->num_packets; } } else { - if (G_LIKELY (keyunit_sync)) { + if (G_LIKELY (demux->keyunit_sync)) { GST_DEBUG_OBJECT (demux, "key unit seek, adjust seek_time = %" GST_TIME_FORMAT " to index_time = %" GST_TIME_FORMAT, GST_TIME_ARGS (seek_time), GST_TIME_ARGS (idx_time)); @@ -1542,7 +1542,7 @@ gst_asf_demux_find_stream_with_complete_payload (GstASFDemux * demux) if (G_UNLIKELY (GST_CLOCK_TIME_IS_VALID (payload->ts) && (payload->ts < demux->segment.start))) { - if (G_UNLIKELY ((!demux->accurate) && payload->keyframe)) { + if (G_UNLIKELY (demux->keyunit_sync && payload->keyframe)) { GST_DEBUG_OBJECT (stream->pad, "Found keyframe, updating segment start to %" GST_TIME_FORMAT, GST_TIME_ARGS (payload->ts)); @@ -1620,8 +1620,8 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force) } /* FIXME : only if ACCURATE ! */ - if (G_LIKELY (!demux->accurate - && (GST_CLOCK_TIME_IS_VALID (payload->ts)))) { + if (G_LIKELY (demux->keyunit_sync + && GST_CLOCK_TIME_IS_VALID (payload->ts))) { GST_DEBUG ("Adjusting newsegment start to %" GST_TIME_FORMAT, GST_TIME_ARGS (payload->ts)); demux->segment.start = payload->ts; @@ -4541,7 +4541,7 @@ gst_asf_demux_change_state (GstElement * element, GstStateChange transition) gst_segment_init (&demux->segment, GST_FORMAT_TIME); demux->need_newsegment = TRUE; demux->segment_running = FALSE; - demux->accurate = FALSE; + demux->keyunit_sync = FALSE; demux->adapter = gst_adapter_new (); demux->metadata = gst_caps_new_empty (); demux->global_metadata = gst_structure_new_empty ("metadata"); diff --git a/gst/asfdemux/gstasfdemux.h b/gst/asfdemux/gstasfdemux.h index daad917aae..9f720d8485 100644 --- a/gst/asfdemux/gstasfdemux.h +++ b/gst/asfdemux/gstasfdemux.h @@ -205,7 +205,7 @@ struct _GstASFDemux { gboolean broadcast; GstSegment segment; /* configured play segment */ - gboolean accurate; + gboolean keyunit_sync; gboolean need_newsegment; /* do we need to send a new-segment event? */ guint32 segment_seqnum; /* if the new segment must have this seqnum */ |