diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 35a52d31b9..75db7a0b2a 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -26,6 +26,7 @@ Andy Hochhaus Chad Assareh Costel Madalin Grecu Donato Borrello +Duc Pham Esteban Dosztal Itay Kinnrot Jacob Trimble diff --git a/lib/dash/mpd_utils.js b/lib/dash/mpd_utils.js index 6bd82382d4..e2ce65a5b9 100644 --- a/lib/dash/mpd_utils.js +++ b/lib/dash/mpd_utils.js @@ -45,6 +45,7 @@ shaka.dash.MpdUtils.GAP_OVERLAP_TOLERANCE_SECONDS = 1 / 15; /** * @typedef {{ * start: number, + * unscaledStart: number, * end: number * }} * @@ -53,6 +54,8 @@ shaka.dash.MpdUtils.GAP_OVERLAP_TOLERANCE_SECONDS = 1 / 15; * * @property {number} start * The start time of the range. + * @property {number} unscaledStart + * The start time of the range in representation timescale units. * @property {number} end * The end time (exclusive) of the range. */ @@ -65,6 +68,7 @@ shaka.dash.MpdUtils.TimeRange; * segmentDuration: ?number, * startNumber: number, * presentationTimeOffset: number, + * unscaledPresentationTimeOffset: number, * timeline: Array. * }} * @@ -79,6 +83,8 @@ shaka.dash.MpdUtils.TimeRange; * The start number of the segments; 1 or greater. * @property {number} presentationTimeOffset * The presentationTimeOffset of the representation, in seconds. + * @property {number} unscaledPresentationTimeOffset + * The presentationTimeOffset of the representation, in timescale units. * @property {Array.} timeline * The timeline of the representation, if given. Times in seconds. */ @@ -270,8 +276,12 @@ shaka.dash.MpdUtils.createTimeline = function( for (var j = 0; j <= repeat; ++j) { var endTime = startTime + d; - timeline.push( - {start: (startTime / timescale), end: (endTime / timescale)}); + var item = { + start: startTime / timescale, + end: endTime / timescale, + unscaledStart: startTime + }; + timeline.push(item); startTime = endTime; lastEndTime = endTime; @@ -423,6 +433,7 @@ shaka.dash.MpdUtils.parseSegmentInfo = function(context, callback) { segmentDuration: segmentDuration, startNumber: startNumber, presentationTimeOffset: pto, + unscaledPresentationTimeOffset: Number(presentationTimeOffset), timeline: timeline }; }; diff --git a/lib/dash/segment_template.js b/lib/dash/segment_template.js index ec100849d2..55d85a2b18 100644 --- a/lib/dash/segment_template.js +++ b/lib/dash/segment_template.js @@ -113,6 +113,7 @@ shaka.dash.SegmentTemplate.createStream = function( * segmentDuration: ?number, * startNumber: number, * presentationTimeOffset: number, + * unscaledPresentationTimeOffset: number, * timeline: Array., * mediaTemplate: ?string, * indexTemplate: ?string @@ -130,6 +131,8 @@ shaka.dash.SegmentTemplate.createStream = function( * The start number of the segments; 1 or greater. * @property {number} presentationTimeOffset * The presentationTimeOffset of the representation, in seconds. + * @property {number} unscaledPresentationTimeOffset + * The presentationTimeOffset of the representation, in timescale units. * @property {Array.} timeline * The timeline of the representation, if given. Times in seconds. * @property {?string} mediaTemplate @@ -173,6 +176,7 @@ shaka.dash.SegmentTemplate.parseSegmentTemplateInfo_ = function(context) { timescale: segmentInfo.timescale, startNumber: segmentInfo.startNumber, presentationTimeOffset: segmentInfo.presentationTimeOffset, + unscaledPresentationTimeOffset: segmentInfo.unscaledPresentationTimeOffset, timeline: segmentInfo.timeline, mediaTemplate: media, indexTemplate: index @@ -352,6 +356,7 @@ shaka.dash.SegmentTemplate.createFromTimeline_ = function(context, info) { var references = []; for (var i = 0; i < info.timeline.length; i++) { var start = info.timeline[i].start; + var unscaledStart = info.timeline[i].unscaledStart; var end = info.timeline[i].end; // Note: i = k - 1, where k indicates the k'th segment listed in the MPD. @@ -359,9 +364,8 @@ shaka.dash.SegmentTemplate.createFromTimeline_ = function(context, info) { var segmentReplacement = i + info.startNumber; // Consider the presentation time offset in segment uri computation - var timeReplacement = (start + info.presentationTimeOffset) * - info.timescale; - + var timeReplacement = unscaledStart + + info.unscaledPresentationTimeOffset; var createUris = (function( template, repId, bandwidth, baseUris, segmentId, time) { var mediaUri = MpdUtils.fillUriTemplate(