@@ -22,7 +22,7 @@ if (!Number.MAX_SAFE_INTEGER) {
2222Mss . dependencies . MssParser = function ( ) {
2323 "use strict" ;
2424
25- var TIME_SCALE_100_NANOSECOND_UNIT = 10000000.0 ,
25+ var DEFAULT_TIME_SCALE = 10000000.0 ,
2626 SUPPORTED_CODECS = [ "AAC" , "AACL" , "AVC1" , "H264" , "TTML" , "DFXP" ] ,
2727 samplingFrequencyIndex = {
2828 96000 : 0x0 ,
@@ -47,7 +47,7 @@ Mss.dependencies.MssParser = function() {
4747 xmlDoc = null ,
4848 baseURL = null ,
4949
50- mapPeriod = function ( ) {
50+ mapPeriod = function ( timescale ) {
5151 var period = { } ,
5252 adaptations = [ ] ,
5353 adaptation ,
@@ -59,7 +59,7 @@ Mss.dependencies.MssParser = function() {
5959 // For each StreamIndex node, create an AdaptationSet element
6060 for ( i = 0 ; i < smoothNode . childNodes . length ; i ++ ) {
6161 if ( smoothNode . childNodes [ i ] . nodeName === "StreamIndex" ) {
62- adaptation = mapAdaptationSet . call ( this , smoothNode . childNodes [ i ] ) ;
62+ adaptation = mapAdaptationSet . call ( this , smoothNode . childNodes [ i ] , timescale ) ;
6363 if ( adaptation !== null ) {
6464 adaptations . push ( adaptation ) ;
6565 }
@@ -74,7 +74,7 @@ Mss.dependencies.MssParser = function() {
7474 return period ;
7575 } ,
7676
77- mapAdaptationSet = function ( streamIndex ) {
77+ mapAdaptationSet = function ( streamIndex , timescale ) {
7878
7979 var adaptationSet = { } ,
8080 representations = [ ] ,
@@ -98,7 +98,7 @@ Mss.dependencies.MssParser = function() {
9898 }
9999
100100 // Create a SegmentTemplate with a SegmentTimeline
101- segmentTemplate = mapSegmentTemplate . call ( this , streamIndex ) ;
101+ segmentTemplate = mapSegmentTemplate . call ( this , streamIndex , timescale ) ;
102102
103103 qualityLevels = this . domParser . getChildNodes ( streamIndex , "QualityLevel" ) ;
104104 // For each QualityLevel node, create a Representation element
@@ -265,23 +265,27 @@ Mss.dependencies.MssParser = function() {
265265 return "mp4a.40." + objectType ;
266266 } ,
267267
268- mapSegmentTemplate = function ( streamIndex ) {
268+ mapSegmentTemplate = function ( streamIndex , timescale ) {
269269
270270 var segmentTemplate = { } ,
271- mediaUrl ;
271+ mediaUrl ,
272+ streamIndexTimeScale ;
272273
273274 mediaUrl = this . domParser . getAttributeValue ( streamIndex , "Url" ) . replace ( '{bitrate}' , '$Bandwidth$' ) ;
274275 mediaUrl = mediaUrl . replace ( '{start time}' , '$Time$' ) ;
275276
277+ streamIndexTimeScale = this . domParser . getAttributeValue ( streamIndex , "TimeScale" ) ;
278+ streamIndexTimeScale = streamIndexTimeScale ? parseFloat ( streamIndexTimeScale ) : timescale ;
279+
276280 segmentTemplate . media = mediaUrl ;
277- segmentTemplate . timescale = TIME_SCALE_100_NANOSECOND_UNIT ;
281+ segmentTemplate . timescale = streamIndexTimeScale ;
278282
279- segmentTemplate . SegmentTimeline = mapSegmentTimeline . call ( this , streamIndex ) ;
283+ segmentTemplate . SegmentTimeline = mapSegmentTimeline . call ( this , streamIndex , segmentTemplate . timescale ) ;
280284
281285 return segmentTemplate ;
282286 } ,
283287
284- mapSegmentTimeline = function ( streamIndex ) {
288+ mapSegmentTimeline = function ( streamIndex , timescale ) {
285289
286290 var segmentTimeline = { } ,
287291 chunks = this . domParser . getChildNodes ( streamIndex , "c" ) ,
@@ -361,7 +365,7 @@ Mss.dependencies.MssParser = function() {
361365
362366 segmentTimeline . S = segments ;
363367 segmentTimeline . S_asArray = segments ;
364- segmentTimeline . duration = duration / TIME_SCALE_100_NANOSECOND_UNIT ;
368+ segmentTimeline . duration = duration / timescale ;
365369
366370 return segmentTimeline ;
367371 } ,
@@ -559,22 +563,24 @@ Mss.dependencies.MssParser = function() {
559563 // Set mpd node properties
560564 mpd . name = 'MSS' ;
561565 mpd . profiles = "urn:mpeg:dash:profile:isoff-live:2011" ;
566+ var timescale = this . domParser . getAttributeValue ( smoothNode , 'TimeScale' ) ;
567+ mpd . timescale = timescale ? parseFloat ( timescale ) : DEFAULT_TIME_SCALE ;
562568 var isLive = this . domParser . getAttributeValue ( smoothNode , 'IsLive' ) ;
563569 mpd . type = ( isLive !== null && isLive . toLowerCase ( ) === 'true' ) ? 'dynamic' : 'static' ;
564- mpd . timeShiftBufferDepth = parseFloat ( this . domParser . getAttributeValue ( smoothNode , 'DVRWindowLength' ) ) / TIME_SCALE_100_NANOSECOND_UNIT ;
570+ mpd . timeShiftBufferDepth = parseFloat ( this . domParser . getAttributeValue ( smoothNode , 'DVRWindowLength' ) ) / mpd . timescale ;
565571 var duration = parseFloat ( this . domParser . getAttributeValue ( smoothNode , 'Duration' ) ) ;
566572
567573 // If live manifest with Duration, we consider it as a start-over manifest
568574 if ( mpd . type === "dynamic" && duration > 0 ) {
569575 mpd . type = "static" ;
570576 mpd . startOver = true ;
571577 // We set timeShiftBufferDepth to initial duration, to be used by MssFragmentController to update segment timeline
572- mpd . timeShiftBufferDepth = duration / TIME_SCALE_100_NANOSECOND_UNIT ;
578+ mpd . timeShiftBufferDepth = duration / mpd . timescale ;
573579 // Duration will be set according to current segment timeline duration (see below)
574580 }
575581
576582 // Complete manifest/mpd initialization
577- mpd . mediaPresentationDuration = ( duration === 0 ) ? Infinity : ( duration / TIME_SCALE_100_NANOSECOND_UNIT ) ;
583+ mpd . mediaPresentationDuration = ( duration === 0 ) ? Infinity : ( duration / mpd . timescale ) ;
578584 mpd . BaseURL = baseURL ;
579585 mpd . minBufferTime = MediaPlayer . dependencies . BufferExtensions . DEFAULT_MIN_BUFFER_TIME ;
580586
@@ -584,7 +590,7 @@ Mss.dependencies.MssParser = function() {
584590 }
585591
586592 // Map period node to manifest root node
587- mpd . Period = mapPeriod . call ( this ) ;
593+ mpd . Period = mapPeriod . call ( this , mpd . timescale ) ;
588594 mpd . Period_asArray = [ mpd . Period ] ;
589595
590596 period = mpd . Period ;
@@ -674,7 +680,7 @@ Mss.dependencies.MssParser = function() {
674680 for ( i = 0 ; i < adaptations . length ; i ++ ) {
675681 if ( adaptations [ i ] . contentType === 'audio' || adaptations [ i ] . contentType === 'video' ) {
676682 segments = adaptations [ i ] . SegmentTemplate . SegmentTimeline . S_asArray ;
677- startTime = segments [ 0 ] . t ;
683+ startTime = segments [ 0 ] . t / adaptations [ i ] . SegmentTemplate . timescale ;
678684 if ( timestampOffset === undefined ) {
679685 timestampOffset = startTime ;
680686 }
@@ -695,13 +701,13 @@ Mss.dependencies.MssParser = function() {
695701 if ( ! segments [ j ] . tManifest ) {
696702 segments [ j ] . tManifest = segments [ j ] . t ;
697703 }
698- segments [ j ] . t -= timestampOffset ;
704+ segments [ j ] . t -= ( timestampOffset * adaptations [ i ] . SegmentTemplate . timescale ) ;
699705 }
700706 if ( adaptations [ i ] . contentType === 'audio' || adaptations [ i ] . contentType === 'video' ) {
701707 period . start = Math . max ( segments [ 0 ] . t , period . start ) ;
702708 }
703709 }
704- period . start /= TIME_SCALE_100_NANOSECOND_UNIT ;
710+ period . start /= mpd . timescale ;
705711 }
706712 }
707713
0 commit comments