qtdemux: handle empty segments in seeking adjust

If seeking targets an empty segment skip it as there is no media
offset to get from it. Instead look for the next one.

This doesn't make seeking in push-mode work if you seek to an
empty segment but at least won't get you to wrong offsets.

https://bugzilla.gnome.org/show_bug.cgi?id=753484
This commit is contained in:
Thiago Santos 2015-08-10 18:14:39 -03:00 committed by Luis de Bethencourt
parent 5e4caca709
commit df0a31b4ee

View file

@ -1234,6 +1234,7 @@ gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time,
GstClockTime media_time; GstClockTime media_time;
GstClockTime seg_time; GstClockTime seg_time;
QtDemuxSegment *seg; QtDemuxSegment *seg;
gboolean empty_segment = FALSE;
str = qtdemux->streams[n]; str = qtdemux->streams[n];
@ -1247,15 +1248,34 @@ gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time,
seg = &str->segments[seg_idx]; seg = &str->segments[seg_idx];
seg_time = desired_time - seg->time; seg_time = desired_time - seg->time;
while (QTSEGMENT_IS_EMPTY (seg)) {
seg_time = 0;
empty_segment = TRUE;
GST_DEBUG_OBJECT (str->pad, "Segment %d is empty, moving to next one",
seg_idx);
seg_idx++;
if (seg_idx == str->n_segments)
break;
seg = &str->segments[seg_idx];
}
if (seg_idx == str->n_segments) {
/* FIXME track shouldn't have the last segment as empty, but if it
* happens we better handle it */
continue;
}
/* get the media time in the segment */ /* get the media time in the segment */
media_start = seg->media_start + seg_time; media_start = seg->media_start + seg_time;
/* get the index of the sample with media time */ /* get the index of the sample with media time */
index = gst_qtdemux_find_index_linear (qtdemux, str, media_start); index = gst_qtdemux_find_index_linear (qtdemux, str, media_start);
GST_DEBUG_OBJECT (qtdemux, "sample for %" GST_TIME_FORMAT " at %u" GST_DEBUG_OBJECT (qtdemux, "sample for %" GST_TIME_FORMAT " at %u"
" at offset %" G_GUINT64_FORMAT, " at offset %" G_GUINT64_FORMAT " (empty segment: %d)",
GST_TIME_ARGS (media_start), index, str->samples[index].offset); GST_TIME_ARGS (media_start), index, str->samples[index].offset,
empty_segment);
if (!empty_segment) {
/* find previous keyframe */ /* find previous keyframe */
kindex = gst_qtdemux_find_keyframe (qtdemux, str, index); kindex = gst_qtdemux_find_keyframe (qtdemux, str, index);
@ -1284,6 +1304,7 @@ gst_qtdemux_adjust_seek (GstQTDemux * qtdemux, gint64 desired_time,
min_offset = seg_time; min_offset = seg_time;
} }
} }
}
if (min_byte_offset < 0 || str->samples[index].offset < min_byte_offset) if (min_byte_offset < 0 || str->samples[index].offset < min_byte_offset)
min_byte_offset = str->samples[index].offset; min_byte_offset = str->samples[index].offset;