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 d1e710cfa5..a0d50a7f48 100644 --- a/lib/dash/mpd_utils.js +++ b/lib/dash/mpd_utils.js @@ -44,6 +44,7 @@ shaka.dash.MpdUtils.GAP_OVERLAP_TOLERANCE_SECONDS = 1 / 15; /** * @typedef {{ * start: number, + * unscaledStart: number, * end: number * }} * @@ -52,6 +53,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. */ @@ -64,6 +67,7 @@ shaka.dash.MpdUtils.TimeRange; * segmentDuration: ?number, * startNumber: number, * presentationTimeOffset: number, + * unscaledPresentationTimeOffset: number, * timeline: Array. * }} * @@ -78,6 +82,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. */ @@ -269,8 +275,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; @@ -398,6 +408,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 b474fa1a52..7d81c411da 100644 --- a/lib/dash/segment_template.js +++ b/lib/dash/segment_template.js @@ -114,6 +114,7 @@ shaka.dash.SegmentTemplate.createStream = function( * segmentDuration: ?number, * startNumber: number, * presentationTimeOffset: number, + * unscaledPresentationTimeOffset: number, * timeline: Array., * mediaTemplate: ?string, * indexTemplate: ?string @@ -131,6 +132,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 @@ -174,6 +177,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 @@ -357,6 +361,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. @@ -364,9 +369,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(