Revert "qtdemux: Always snap to the start of the keyframe"

This reverts commit 107902ec51.

This commit intended to ensure that keyframe seeks land at the
start timestamp of a keyframe, rather than in the middle of one,
but they cause trouble on files with sparse streams, or with
JPEG 'cover art' tracks that have only one or a few JPEG samples
with very long durations.

That's still desirable for doing seamless cutting of videos,
but needs a rethink for implementation.

https://bugzilla.gnome.org/show_bug.cgi?id=778690
This commit is contained in:
Jan Schmidt 2017-02-17 13:07:05 +11:00
parent c32bf052a0
commit 488e8edba4

View file

@ -1296,7 +1296,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;
guint32 index, kindex;
guint32 seg_idx;
GstClockTime media_start;
GstClockTime media_time;
@ -1350,20 +1350,23 @@ gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time,
if (!empty_segment) {
/* find previous keyframe */
index = gst_qtdemux_find_keyframe (qtdemux, str, index, next);
kindex = gst_qtdemux_find_keyframe (qtdemux, str, index, next);
/* we will settle for one before if none found after */
if (next && index == -1)
index = gst_qtdemux_find_keyframe (qtdemux, str, index, FALSE);
if (next && kindex == -1)
kindex = gst_qtdemux_find_keyframe (qtdemux, str, index, FALSE);
/* Snap to the start ts of the keyframe we found */
/* if the keyframe is at a different position, we need to update the
* requested seek time */
if (index != kindex) {
index = kindex;
/* get timestamp of keyframe */
media_time = QTSAMPLE_PTS_NO_CSLG (str, &str->samples[index]);
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, index, GST_TIME_ARGS (media_time),
str->samples[index].offset);
G_GUINT64_FORMAT, kindex, GST_TIME_ARGS (media_time),
str->samples[kindex].offset);
/* keyframes in the segment get a chance to change the
* desired_offset. keyframes out of the segment are
@ -1379,6 +1382,7 @@ gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time,
min_offset = seg_time;
}
}
}
if (min_byte_offset < 0 || str->samples[index].offset < min_byte_offset)
min_byte_offset = str->samples[index].offset;