asfdemux: Don't modify segment values on accurate seeks

When dealing with accurate seeks, we want to return exactly the segment
that was requested by the seek event, and not adjust the values.

https://bugzilla.gnome.org/show_bug.cgi?id=755469
This commit is contained in:
Edward Hervey 2016-03-08 12:26:01 +01:00 committed by Edward Hervey
parent 7d021628cf
commit dba14178ce
2 changed files with 11 additions and 6 deletions

View File

@ -290,6 +290,7 @@ gst_asf_demux_reset (GstASFDemux * demux, gboolean chain_reset)
demux->segment_seqnum = 0; demux->segment_seqnum = 0;
demux->segment_running = FALSE; demux->segment_running = FALSE;
demux->keyunit_sync = FALSE; demux->keyunit_sync = FALSE;
demux->accurate = FALSE;
demux->metadata = gst_caps_new_empty (); demux->metadata = gst_caps_new_empty ();
demux->global_metadata = gst_structure_new_empty ("metadata"); demux->global_metadata = gst_structure_new_empty ("metadata");
demux->data_size = 0; demux->data_size = 0;
@ -637,7 +638,7 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event)
GstSeekType cur_type, stop_type; GstSeekType cur_type, stop_type;
GstFormat format; GstFormat format;
gboolean only_need_update; gboolean only_need_update;
gboolean accurate, after, before, next; gboolean after, before, next;
gboolean flush; gboolean flush;
gdouble rate; gdouble rate;
gint64 cur, stop; gint64 cur, stop;
@ -682,7 +683,8 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event)
seqnum = gst_event_get_seqnum (event); seqnum = gst_event_get_seqnum (event);
flush = ((flags & GST_SEEK_FLAG_FLUSH) == GST_SEEK_FLAG_FLUSH); flush = ((flags & GST_SEEK_FLAG_FLUSH) == GST_SEEK_FLAG_FLUSH);
accurate = ((flags & GST_SEEK_FLAG_ACCURATE) == GST_SEEK_FLAG_ACCURATE); demux->accurate =
((flags & GST_SEEK_FLAG_ACCURATE) == GST_SEEK_FLAG_ACCURATE);
demux->keyunit_sync = demux->keyunit_sync =
((flags & GST_SEEK_FLAG_KEY_UNIT) == GST_SEEK_FLAG_KEY_UNIT); ((flags & GST_SEEK_FLAG_KEY_UNIT) == GST_SEEK_FLAG_KEY_UNIT);
after = ((flags & GST_SEEK_FLAG_SNAP_AFTER) == GST_SEEK_FLAG_SNAP_AFTER); after = ((flags & GST_SEEK_FLAG_SNAP_AFTER) == GST_SEEK_FLAG_SNAP_AFTER);
@ -784,7 +786,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 * 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 * before the segment start. For audio-only this is unnecessary as every
* frame is 'key'. */ * frame is 'key'. */
if (flush && (accurate || (demux->keyunit_sync && !next)) if (flush && (demux->accurate || (demux->keyunit_sync && !next))
&& demux->num_video_streams > 0) { && demux->num_video_streams > 0) {
seek_time -= 5 * GST_SECOND; seek_time -= 5 * GST_SECOND;
if (seek_time < 0) if (seek_time < 0)
@ -798,7 +800,7 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event)
packet = demux->num_packets; packet = demux->num_packets;
} }
} else { } else {
if (G_LIKELY (demux->keyunit_sync)) { if (G_LIKELY (demux->keyunit_sync && !demux->accurate)) {
GST_DEBUG_OBJECT (demux, "key unit seek, adjust seek_time = %" GST_DEBUG_OBJECT (demux, "key unit seek, adjust seek_time = %"
GST_TIME_FORMAT " to index_time = %" GST_TIME_FORMAT, GST_TIME_FORMAT " to index_time = %" GST_TIME_FORMAT,
GST_TIME_ARGS (seek_time), GST_TIME_ARGS (idx_time)); GST_TIME_ARGS (seek_time), GST_TIME_ARGS (idx_time));
@ -1598,7 +1600,8 @@ gst_asf_demux_find_stream_with_complete_payload (GstASFDemux * demux)
if (G_UNLIKELY (GST_CLOCK_TIME_IS_VALID (payload->ts) && if (G_UNLIKELY (GST_CLOCK_TIME_IS_VALID (payload->ts) &&
(payload->ts < demux->segment.start))) { (payload->ts < demux->segment.start))) {
if (G_UNLIKELY ((!demux->keyunit_sync) && payload->keyframe)) { if (G_UNLIKELY ((!demux->keyunit_sync) && (!demux->accurate)
&& payload->keyframe)) {
GST_DEBUG_OBJECT (stream->pad, GST_DEBUG_OBJECT (stream->pad,
"Found keyframe, updating segment start to %" GST_TIME_FORMAT, "Found keyframe, updating segment start to %" GST_TIME_FORMAT,
GST_TIME_ARGS (payload->ts)); GST_TIME_ARGS (payload->ts));
@ -1681,7 +1684,7 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force)
} }
/* FIXME : only if ACCURATE ! */ /* FIXME : only if ACCURATE ! */
if (G_LIKELY (!demux->keyunit_sync if (G_LIKELY (!demux->keyunit_sync && !demux->accurate
&& (GST_CLOCK_TIME_IS_VALID (payload->ts))) && (GST_CLOCK_TIME_IS_VALID (payload->ts)))
&& !GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { && !GST_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) {
GST_DEBUG ("Adjusting newsegment start to %" GST_TIME_FORMAT, GST_DEBUG ("Adjusting newsegment start to %" GST_TIME_FORMAT,
@ -4667,6 +4670,7 @@ gst_asf_demux_change_state (GstElement * element, GstStateChange transition)
demux->need_newsegment = TRUE; demux->need_newsegment = TRUE;
demux->segment_running = FALSE; demux->segment_running = FALSE;
demux->keyunit_sync = FALSE; demux->keyunit_sync = FALSE;
demux->accurate = FALSE;
demux->adapter = gst_adapter_new (); demux->adapter = gst_adapter_new ();
demux->metadata = gst_caps_new_empty (); demux->metadata = gst_caps_new_empty ();
demux->global_metadata = gst_structure_new_empty ("metadata"); demux->global_metadata = gst_structure_new_empty ("metadata");

View File

@ -213,6 +213,7 @@ struct _GstASFDemux {
GstSegment segment; /* configured play segment */ GstSegment segment; /* configured play segment */
gboolean keyunit_sync; gboolean keyunit_sync;
gboolean accurate;
gboolean need_newsegment; /* do we need to send a new-segment event? */ gboolean need_newsegment; /* do we need to send a new-segment event? */
guint32 segment_seqnum; /* if the new segment must have this seqnum */ guint32 segment_seqnum; /* if the new segment must have this seqnum */