From 4e228e0a1f2b01c79378a9d0ba56b58353a5a572 Mon Sep 17 00:00:00 2001 From: Mathieu Duponchelle Date: Thu, 27 Nov 2014 05:53:20 +0100 Subject: [PATCH] oggdemux: Fix seeking before the first frame. The previous code was setting keytarget to target to make sure the keyframe found for each pad was indeed before the target. Then if target == keytarget, it assumed a keyframe had been found, which was not the case if target was before the first frame in the file. This patch checks that a keyframe was indeed found, and if not seeks to 0, without bisecting again. Assuming default gst qa assets in $HOME/gst-validate seek_before_first_frame.scenario: description, seek=true, handles-states=true pause, playback-time=0.0 seek, playback-time=0.0, start=0.0, flags=accurate+flush seek, playback-time=0.0, start=0.01, flags=accurate+flush seek, playback-time=0.0, start=0.1, flags=accurate+flush GST_DEBUG=*theoradec*:2 gst-validate-1.0 playbin \ uri=file://$HOME/gst-validate/gst-qa-assets/medias/ogg/vorbis_theora.0.ogg \ --set-scenario seek_before_first_frame.scenario https://bugzilla.gnome.org/show_bug.cgi?id=741097 --- ext/ogg/gstoggdemux.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ext/ogg/gstoggdemux.c b/ext/ogg/gstoggdemux.c index 2a98e20c36..b6b7f709ca 100644 --- a/ext/ogg/gstoggdemux.c +++ b/ext/ogg/gstoggdemux.c @@ -2984,6 +2984,7 @@ gst_ogg_demux_do_seek (GstOggDemux * ogg, GstSegment * segment, GstFlowReturn ret; gint i, pending; gint serialno = 0; + gboolean found_keyframe = FALSE; position = segment->position; @@ -3114,6 +3115,7 @@ gst_ogg_demux_do_seek (GstOggDemux * ogg, GstSegment * segment, if (keyframe_time < keytarget) { serialno = pad->map.serialno; keytarget = keyframe_time; + found_keyframe = TRUE; } } @@ -3127,6 +3129,10 @@ gst_ogg_demux_do_seek (GstOggDemux * ogg, GstSegment * segment, if (segment->rate < 0.0) goto done; + /* No keyframe found, no need to bisect again, keytarget == target here */ + if (!found_keyframe) + best = 0; + if (keytarget != target) { GST_LOG_OBJECT (ogg, "final seek to target %" GST_TIME_FORMAT, GST_TIME_ARGS (keytarget));