From 0391a93a3519c2ea4c375e9668b481c851e59d08 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Thu, 28 Jan 2016 22:36:23 +0900 Subject: [PATCH] qtdemux: handling zero segment-duration edit list Based on document ISO_IEC_14496-12, edit list box can have segment duration as zero. It does not imply that media_start equals to media_stop. But, it just indicates a sample which should be presented at the first. This patch derives segment duration using media_time and duration of file. And set derived duration to segment-duration. https://bugzilla.gnome.org/show_bug.cgi?id=760781 --- gst/isomp4/qtdemux.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index cbba39b..f0b368b 100644 --- a/gst/isomp4/qtdemux.c +++ b/gst/isomp4/qtdemux.c @@ -8019,24 +8019,40 @@ qtdemux_parse_segments (GstQTDemux * qtdemux, QtDemuxStream * stream, guint64 media_time; QtDemuxSegment *segment; guint32 rate_int; + GstClockTime media_start = GST_CLOCK_TIME_NONE; media_time = QT_UINT32 (buffer + 20 + i * 12); duration = QT_UINT32 (buffer + 16 + i * 12); + if (media_time != G_MAXUINT32) + media_start = QTSTREAMTIME_TO_GSTTIME (stream, media_time); + segment = &stream->segments[count++]; /* time and duration expressed in global timescale */ segment->time = stime; /* add non scaled values so we don't cause roundoff errors */ - time += duration; - stime = QTTIME_TO_GSTTIME (qtdemux, time); + if (duration) { + time += duration; + stime = QTTIME_TO_GSTTIME (qtdemux, time); + segment->duration = stime - segment->time; + } else { + /* zero duration does not imply media_start == media_stop + * but, only specify media_start.*/ + stime = QTTIME_TO_GSTTIME (qtdemux, qtdemux->duration); + if (GST_CLOCK_TIME_IS_VALID (stime) && media_time != G_MAXUINT32 + && stime >= media_start) { + segment->duration = stime - media_start; + } else { + segment->duration = GST_CLOCK_TIME_NONE; + } + } segment->stop_time = stime; - segment->duration = stime - segment->time; segment->trak_media_start = media_time; /* media_time expressed in stream timescale */ if (media_time != G_MAXUINT32) { - segment->media_start = QTSTREAMTIME_TO_GSTTIME (stream, media_time); + segment->media_start = media_start; segment->media_stop = segment->media_start + segment->duration; media_segments_count++; } else { -- 2.7.4