Skip to content

Commit 6ac0ebf

Browse files
committed
MssHandler: start MssFragmentInfoControllers on seeking, pause and at startup for start-over streams
1 parent 67f8b0c commit 6ac0ebf

File tree

1 file changed

+57
-36
lines changed

1 file changed

+57
-36
lines changed

src/mss/MssHandler.js

Lines changed: 57 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)