mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-28 03:00:35 +00:00
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
This commit is contained in:
parent
d8bb6687ea
commit
0391a93a35
1 changed files with 20 additions and 4 deletions
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue