From 107902ec514bd826aa29d2298107e2c091e1c779 Mon Sep 17 00:00:00 2001 From: Jan Schmidt Date: Sat, 31 Dec 2016 01:54:01 +1100 Subject: [PATCH] qtdemux: Always snap to the start of the keyframe When performing a key-unit seek, always snap to the start ts of the keyframe buffer we landed on so that the keyframe is entirely within the resulting outgoing segment. That seems the most sensible result, since the user requested snapping to the keyframe position. --- gst/isomp4/qtdemux.c | 48 ++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index 5f660410c9..854ef3ac42 100644 --- a/gst/isomp4/qtdemux.c +++ b/gst/isomp4/qtdemux.c @@ -1294,7 +1294,7 @@ gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time, * and move back to the previous keyframe. */ for (n = 0; n < qtdemux->n_streams; n++) { QtDemuxStream *str; - guint32 index, kindex; + guint32 index; guint32 seg_idx; GstClockTime media_start; GstClockTime media_time; @@ -1348,37 +1348,33 @@ gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time, if (!empty_segment) { /* find previous keyframe */ - kindex = gst_qtdemux_find_keyframe (qtdemux, str, index, next); + index = gst_qtdemux_find_keyframe (qtdemux, str, index, next); /* we will settle for one before if none found after */ - if (next && kindex == -1) - kindex = gst_qtdemux_find_keyframe (qtdemux, str, index, FALSE); + if (next && index == -1) + index = gst_qtdemux_find_keyframe (qtdemux, str, index, FALSE); - /* if the keyframe is at a different position, we need to update the - * requested seek time */ - if (index != kindex) { - index = kindex; + /* Snap to the start ts of the keyframe we found */ - /* get timestamp of keyframe */ - media_time = QTSAMPLE_PTS_NO_CSLG (str, &str->samples[kindex]); - GST_DEBUG_OBJECT (qtdemux, - "keyframe at %u with time %" GST_TIME_FORMAT " at offset %" - G_GUINT64_FORMAT, kindex, GST_TIME_ARGS (media_time), - str->samples[kindex].offset); + /* get timestamp of keyframe */ + media_time = QTSAMPLE_PTS_NO_CSLG (str, &str->samples[index]); + GST_DEBUG_OBJECT (qtdemux, + "keyframe at %u with time %" GST_TIME_FORMAT " at offset %" + G_GUINT64_FORMAT, index, GST_TIME_ARGS (media_time), + str->samples[index].offset); - /* keyframes in the segment get a chance to change the - * desired_offset. keyframes out of the segment are - * ignored. */ - if (media_time >= seg->media_start) { - GstClockTime seg_time; + /* keyframes in the segment get a chance to change the + * desired_offset. keyframes out of the segment are + * ignored. */ + if (media_time >= seg->media_start) { + GstClockTime seg_time; - /* this keyframe is inside the segment, convert back to - * segment time */ - seg_time = (media_time - seg->media_start) + seg->time; - if ((!next && (seg_time < min_offset)) || - (next && (seg_time > min_offset))) - min_offset = seg_time; - } + /* this keyframe is inside the segment, convert back to + * segment time */ + seg_time = (media_time - seg->media_start) + seg->time; + if ((!next && (seg_time < min_offset)) || + (next && (seg_time > min_offset))) + min_offset = seg_time; } }