diff --git a/gst/asfdemux/gstasfdemux.c b/gst/asfdemux/gstasfdemux.c index 0c50b68d4c..226beba808 100644 --- a/gst/asfdemux/gstasfdemux.c +++ b/gst/asfdemux/gstasfdemux.c @@ -290,6 +290,7 @@ gst_asf_demux_reset (GstASFDemux * demux, gboolean chain_reset) demux->segment_seqnum = 0; demux->segment_running = FALSE; demux->keyunit_sync = FALSE; + demux->accurate = FALSE; demux->metadata = gst_caps_new_empty (); demux->global_metadata = gst_structure_new_empty ("metadata"); demux->data_size = 0; @@ -637,7 +638,7 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event) GstSeekType cur_type, stop_type; GstFormat format; gboolean only_need_update; - gboolean accurate, after, before, next; + gboolean after, before, next; gboolean flush; gdouble rate; gint64 cur, stop; @@ -682,7 +683,8 @@ 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); - accurate = ((flags & GST_SEEK_FLAG_ACCURATE) == GST_SEEK_FLAG_ACCURATE); + demux->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); @@ -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 * before the segment start. For audio-only this is unnecessary as every * frame is 'key'. */ - if (flush && (accurate || (demux->keyunit_sync && !next)) + if (flush && (demux->accurate || (demux->keyunit_sync && !next)) && demux->num_video_streams > 0) { seek_time -= 5 * GST_SECOND; if (seek_time < 0) @@ -798,7 +800,7 @@ gst_asf_demux_handle_seek_event (GstASFDemux * demux, GstEvent * event) packet = demux->num_packets; } } 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_TIME_FORMAT " to index_time = %" GST_TIME_FORMAT, 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) && (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, "Found keyframe, updating segment start to %" GST_TIME_FORMAT, GST_TIME_ARGS (payload->ts)); @@ -1681,7 +1684,7 @@ gst_asf_demux_push_complete_payloads (GstASFDemux * demux, gboolean force) } /* 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_ASF_DEMUX_IS_REVERSE_PLAYBACK (demux->segment)) { 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->segment_running = FALSE; demux->keyunit_sync = FALSE; + demux->accurate = 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 d33465f5dd..0e8ad85205 100644 --- a/gst/asfdemux/gstasfdemux.h +++ b/gst/asfdemux/gstasfdemux.h @@ -213,6 +213,7 @@ struct _GstASFDemux { GstSegment segment; /* configured play segment */ gboolean keyunit_sync; + gboolean accurate; gboolean need_newsegment; /* do we need to send a new-segment event? */ guint32 segment_seqnum; /* if the new segment must have this seqnum */