@@ -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