@@ -113,53 +113,72 @@ function MssHandler(config) {
113113 return chunk ;
114114 }
115115
116+ function startFragmentInfoControllers ( ) {
117+
118+ let streamController = playbackController . getStreamController ( ) ;
119+ if ( ! streamController ) {
120+ return ;
121+ }
122+
123+ // Create MssFragmentInfoControllers for each StreamProcessor of active stream (only for audio, video or fragmentedText)
124+ let processors = streamController . getActiveStreamProcessors ( ) ;
125+ processors . forEach ( function ( processor ) {
126+ if ( processor . getType ( ) === constants . VIDEO ||
127+ processor . getType ( ) === constants . AUDIO ||
128+ processor . getType ( ) === constants . FRAGMENTED_TEXT ) {
129+
130+ // Check MssFragmentInfoController already registered to StreamProcessor
131+ let i ;
132+ let alreadyRegistered = false ;
133+ let externalControllers = processor . getExternalControllers ( ) ;
134+ for ( i = 0 ; i < externalControllers . length ; i ++ ) {
135+ if ( externalControllers [ i ] . controllerType &&
136+ externalControllers [ i ] . controllerType === 'MssFragmentInfoController' ) {
137+ alreadyRegistered = true ;
138+ }
139+ }
140+
141+ if ( ! alreadyRegistered ) {
142+ let fragmentInfoController = MssFragmentInfoController ( context ) . create ( {
143+ streamProcessor : processor ,
144+ eventBus : eventBus ,
145+ metricsModel : metricsModel ,
146+ playbackController : playbackController ,
147+ baseURLController : config . baseURLController ,
148+ ISOBoxer : config . ISOBoxer ,
149+ debug : config . debug
150+ } ) ;
151+ fragmentInfoController . initialize ( ) ;
152+ fragmentInfoController . start ( ) ;
153+ }
154+ }
155+ } ) ;
156+ }
157+
116158 function onSegmentMediaLoaded ( e ) {
117159 if ( e . error ) {
118160 return ;
119161 }
120162 // Process moof to transcode it from MSS to DASH
121163 let streamProcessor = e . sender . getStreamProcessor ( ) ;
122164 mssFragmentProcessor . processFragment ( e , streamProcessor ) ;
165+
166+ // Start MssFragmentInfoControllers in case of start-over streams
167+ let streamInfo = streamProcessor . getStreamInfo ( ) ;
168+ if ( ! streamInfo . manifestInfo . isDynamic && streamInfo . manifestInfo . DVRWindowSize !== Infinity ) {
169+ startFragmentInfoControllers ( ) ;
170+ }
123171 }
124172
125- function onPlaybackSeekAsked ( ) {
173+ function onPlaybackPaused ( ) {
126174 if ( playbackController . getIsDynamic ( ) && playbackController . getTime ( ) !== 0 ) {
175+ startFragmentInfoControllers ( ) ;
176+ }
177+ }
127178
128- //create fragment info controllers for each stream processors of active stream (only for audio, video or fragmentedText)
129- let streamController = playbackController . getStreamController ( ) ;
130- if ( streamController ) {
131- let processors = streamController . getActiveStreamProcessors ( ) ;
132- processors . forEach ( function ( processor ) {
133- if ( processor . getType ( ) === constants . VIDEO ||
134- processor . getType ( ) === constants . AUDIO ||
135- processor . getType ( ) === constants . FRAGMENTED_TEXT ) {
136-
137- // check that there is no fragment info controller registered to processor
138- let i ;
139- let alreadyRegistered = false ;
140- let externalControllers = processor . getExternalControllers ( ) ;
141- for ( i = 0 ; i < externalControllers . length ; i ++ ) {
142- if ( externalControllers [ i ] . controllerType &&
143- externalControllers [ i ] . controllerType === 'MssFragmentInfoController' ) {
144- alreadyRegistered = true ;
145- }
146- }
147-
148- if ( ! alreadyRegistered ) {
149- let fragmentInfoController = MssFragmentInfoController ( context ) . create ( {
150- streamProcessor : processor ,
151- eventBus : eventBus ,
152- metricsModel : metricsModel ,
153- playbackController : playbackController ,
154- ISOBoxer : config . ISOBoxer ,
155- debug : config . debug
156- } ) ;
157- fragmentInfoController . initialize ( ) ;
158- fragmentInfoController . start ( ) ;
159- }
160- }
161- } ) ;
162- }
179+ function onPlaybackSeekAsked ( ) {
180+ if ( playbackController . getIsDynamic ( ) && playbackController . getTime ( ) !== 0 ) {
181+ startFragmentInfoControllers ( ) ;
163182 }
164183 }
165184
@@ -175,13 +194,15 @@ function MssHandler(config) {
175194
176195 function registerEvents ( ) {
177196 eventBus . on ( events . INIT_REQUESTED , onInitializationRequested , instance , dashjs . FactoryMaker . getSingletonFactoryByName ( eventBus . getClassName ( ) ) . EVENT_PRIORITY_HIGH ) ; /* jshint ignore:line */
197+ eventBus . on ( events . PLAYBACK_PAUSED , onPlaybackPaused , instance , dashjs . FactoryMaker . getSingletonFactoryByName ( eventBus . getClassName ( ) ) . EVENT_PRIORITY_HIGH ) ; /* jshint ignore:line */
178198 eventBus . on ( events . PLAYBACK_SEEK_ASKED , onPlaybackSeekAsked , instance , dashjs . FactoryMaker . getSingletonFactoryByName ( eventBus . getClassName ( ) ) . EVENT_PRIORITY_HIGH ) ; /* jshint ignore:line */
179199 eventBus . on ( events . FRAGMENT_LOADING_COMPLETED , onSegmentMediaLoaded , instance , dashjs . FactoryMaker . getSingletonFactoryByName ( eventBus . getClassName ( ) ) . EVENT_PRIORITY_HIGH ) ; /* jshint ignore:line */
180200 eventBus . on ( events . TTML_TO_PARSE , onTTMLPreProcess , instance ) ;
181201 }
182202
183203 function reset ( ) {
184204 eventBus . off ( events . INIT_REQUESTED , onInitializationRequested , this ) ;
205+ eventBus . off ( events . PLAYBACK_PAUSED , onPlaybackPaused , this ) ;
185206 eventBus . off ( events . PLAYBACK_SEEK_ASKED , onPlaybackSeekAsked , this ) ;
186207 eventBus . off ( events . FRAGMENT_LOADING_COMPLETED , onSegmentMediaLoaded , this ) ;
187208 eventBus . off ( events . TTML_TO_PARSE , onTTMLPreProcess , this ) ;
0 commit comments