From 0fd95a9b2e0fb00cad9f91ff715497a115480e45 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 19 Aug 2020 14:51:00 +0200 Subject: [PATCH 01/22] Refactor EventBus: - add possibility to trigger events for specific stream id and media type, only listenesr that have been created for the given stream id and media type are called - add getStreamId() and getType() for classes, used by EventBus to filter listeners - remove all tests in listener methods to check for correct stream id and media type --- src/core/EventBus.js | 27 ++++++++- src/dash/DashHandler.js | 27 +++++---- src/dash/SegmentBaseLoader.js | 42 +++++++------- src/dash/WebmSegmentBaseLoader.js | 41 +++++--------- .../controllers/RepresentationController.js | 49 +++++++---------- src/dash/controllers/SegmentBaseController.js | 8 +-- src/dash/controllers/SegmentsController.js | 18 +++++- src/mss/MssHandler.js | 2 +- src/offline/OfflineStream.js | 14 +++-- src/offline/OfflineStreamProcessor.js | 2 +- src/streaming/SourceBufferSink.js | 11 +++- src/streaming/Stream.js | 28 +++++----- src/streaming/StreamProcessor.js | 39 +++++-------- src/streaming/controllers/AbrController.js | 21 ++++--- .../controllers/BlacklistController.js | 17 +++--- src/streaming/controllers/BufferController.js | 33 +++++------ .../controllers/FragmentController.js | 29 +++++----- src/streaming/controllers/GapController.js | 8 +-- .../controllers/ScheduleController.js | 55 ++++++------------- src/streaming/controllers/StreamController.js | 52 +++++++++--------- .../MetricsCollectionController.js | 17 +++--- src/streaming/models/FragmentModel.js | 24 +++++--- .../text/NotFragmentedTextBufferController.js | 9 +-- .../thumbnail/ThumbnailController.js | 8 ++- src/streaming/thumbnail/ThumbnailTracks.js | 6 +- 25 files changed, 295 insertions(+), 292 deletions(-) diff --git a/src/core/EventBus.js b/src/core/EventBus.js index b001814f9f..d1e94fc080 100644 --- a/src/core/EventBus.js +++ b/src/core/EventBus.js @@ -56,6 +56,13 @@ function EventBus() { priority: priority }; + if (scope && scope.getStreamId) { + handler.streamId = scope.getStreamId(); + } + if (scope && scope.getType) { + handler.mediaType = scope.getType(); + } + const inserted = handlers[type].some((item , idx) => { if (item && priority > item.priority ) { handlers[type].splice(idx, 0, handler); @@ -75,7 +82,7 @@ function EventBus() { handlers[type][idx] = null; } - function trigger(type, payload) { + function trigger(type, payload = {}, streamId = undefined, mediaType = undefined) { if (!type || !handlers[type]) return; payload = payload || {}; @@ -83,9 +90,25 @@ function EventBus() { if (payload.hasOwnProperty('type')) throw new Error('\'type\' is a reserved word for event dispatching'); payload.type = type; + if (streamId) { + payload.streamId = streamId; + } + if (mediaType) { + payload.mediaType = mediaType; + } handlers[type] = handlers[type].filter((item) => item); - handlers[type].forEach( handler => handler && handler.callback.call(handler.scope, payload) ); + const eventHandlers = handlers[type].filter(item => { + if (streamId && item.streamId && item.streamId !== streamId) { + return false; + } + if (mediaType && item.mediaType && item.mediaType !== mediaType) { + return false; + } + return true; + }); + + eventHandlers.forEach(handler => handler && handler.callback.call(handler.scope, payload)); } function getHandlerIdx(type, listener, scope) { diff --git a/src/dash/DashHandler.js b/src/dash/DashHandler.js index 451946678e..67fa6dad75 100644 --- a/src/dash/DashHandler.js +++ b/src/dash/DashHandler.js @@ -85,6 +85,10 @@ function DashHandler(config) { segmentsController.initialize(isDynamic); } + function getStreamId() { + return streamInfo.id; + } + function getType() { return type; } @@ -183,22 +187,20 @@ function DashHandler(config) { dashMetrics.updateManifestUpdateInfo({presentationStartTime: liveEdge}); } - function onRepresentationUpdateStarted(eventObj) { - if (eventObj.sender.getType() !== getType()) return; - - processRepresentation(eventObj.representation); + function onRepresentationUpdateStarted(e) { + processRepresentation(e.representation); } function processRepresentation(voRepresentation) { const hasInitialization = voRepresentation.hasInitialization(); const hasSegments = voRepresentation.hasSegments(); - //if representation has initialization and segments information, REPRESENTATION_UPDATE_COMPLETED can be triggered immediately - //otherwise, it means that a request has to be made to get initialization and/or segments informations + // If representation has initialization and segments information, REPRESENTATION_UPDATE_COMPLETED can be triggered immediately + // otherwise, it means that a request has to be made to get initialization and/or segments informations if (hasInitialization && hasSegments) { - eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, {sender: instance, representation: voRepresentation}); + eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, { representation: voRepresentation }, streamInfo.id, type); } else { - segmentsController.update(voRepresentation, getType(), selectedMimeType, hasInitialization, hasSegments); + segmentsController.update(voRepresentation, selectedMimeType, hasInitialization, hasSegments); } } @@ -358,11 +360,11 @@ function DashHandler(config) { const representation = e.representation; if (!representation.segments) return; - eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, {sender: this, representation: representation}); + eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, { representation: representation }, streamInfo.id, type); } function onSegmentsLoaded(e) { - if (e.error || (getType() !== e.mediaType)) return; + if (e.error) return; const fragments = e.segments; const representation = e.representation; @@ -412,7 +414,7 @@ function DashHandler(config) { return; } - eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, {sender: this, representation: representation}); + eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, { representation: representation }, streamInfo.id, type); } function onDynamicStreamCompleted() { @@ -422,7 +424,8 @@ function DashHandler(config) { instance = { initialize: initialize, - getType: getType, //need to be public in order to be used by logger + getStreamId: getStreamId, + getType: getType, getStreamInfo: getStreamInfo, getInitRequest: getInitRequest, getRequestForSegment: getRequestForSegment, diff --git a/src/dash/SegmentBaseLoader.js b/src/dash/SegmentBaseLoader.js index 479dd9a4d8..6813f84880 100644 --- a/src/dash/SegmentBaseLoader.js +++ b/src/dash/SegmentBaseLoader.js @@ -137,7 +137,7 @@ function SegmentBaseLoader() { } } - function loadInitialization(representation, loadingInfo) { + function loadInitialization(streamId, mediaType, representation, loadingInfo) { checkConfig(); let initRange = null; const baseUrl = representation ? baseURLController.resolve(representation.path) : null; @@ -151,7 +151,7 @@ function SegmentBaseLoader() { searching: false, bytesLoaded: 0, bytesToLoad: 1500, - mediaType: representation && representation.adaptation ? representation.adaptation.type : null + mediaType: mediaType }; logger.debug('Start searching for initialization.'); @@ -166,15 +166,15 @@ function SegmentBaseLoader() { representation.range = initRange; // note that we don't explicitly set rep.initialization as this // will be computed when all BaseURLs are resolved later - eventBus.trigger(events.INITIALIZATION_LOADED, {representation: representation}); + eventBus.trigger(events.INITIALIZATION_LOADED, { representation: representation }, streamId, mediaType); } else { info.range.end = info.bytesLoaded + info.bytesToLoad; - loadInitialization(representation, info); + loadInitialization(streamId, mediaType, representation, info); } }; const onerror = function () { - eventBus.trigger(events.INITIALIZATION_LOADED, {representation: representation}); + eventBus.trigger(events.INITIALIZATION_LOADED, { representation: representation }); }; urlLoader.load({request: request, success: onload, error: onerror}); @@ -182,7 +182,7 @@ function SegmentBaseLoader() { logger.debug('Perform init search: ' + info.url); } - function loadSegments(representation, type, range, callback, loadingInfo) { + function loadSegments(streamId, mediaType, representation, range, callback, loadingInfo) { checkConfig(); if (range && (range.start === undefined || range.end === undefined)) { const parts = range ? range.toString().split('-') : null; @@ -201,7 +201,7 @@ function SegmentBaseLoader() { searching: !hasRange, bytesLoaded: loadingInfo ? loadingInfo.bytesLoaded : 0, bytesToLoad: 1500, - mediaType: representation && representation.adaptation ? representation.adaptation.type : null + mediaType: mediaType }; const request = getFragmentRequest(info); @@ -220,7 +220,7 @@ function SegmentBaseLoader() { info.range.end = info.range.start + (sidx.size || extraBytes); } else if (loadedLength < info.bytesLoaded) { // if we have reached a search limit or if we have reached the end of the file we have to stop trying to find sidx - callback(null, representation, type); + callback(streamId, mediaType, null, representation); return; } else { const lastBox = isoFile.getLastBox(); @@ -232,7 +232,7 @@ function SegmentBaseLoader() { info.range.end += extraBytes; } } - loadSegments(representation, type, info.range, callback, info); + loadSegments(streamId, mediaType, representation, info.range, callback, info); } else { const ref = sidx.references; let loadMultiSidx, @@ -260,10 +260,10 @@ function SegmentBaseLoader() { segs.sort(function (a, b) { return a.startTime - b.startTime < 0 ? -1 : 0; }); - callback(segs, representation, type); + callback(streamId, mediaType, segs, representation); } } else { - callback(null, representation, type); + callback(streamId, mediaType, null, representation); } }; @@ -272,19 +272,19 @@ function SegmentBaseLoader() { se = offset + ref[j].referenced_size - 1; offset = offset + ref[j].referenced_size; r = {start: ss, end: se}; - loadSegments(representation, null, r, tmpCallback, info); + loadSegments(streamId, mediaType, representation, r, tmpCallback, info); } } else { - logger.debug('Parsing segments from SIDX. representation ' + representation.adaptation.type + ' - id: ' + representation.id + ' for range : ' + info.range.start + ' - ' + info.range.end); + logger.debug('Parsing segments from SIDX. representation ' + mediaType + ' - id: ' + representation.id + ' for range : ' + info.range.start + ' - ' + info.range.end); segments = getSegmentsForSidx(sidx, info); - callback(segments, representation, type); + callback(streamId, mediaType, segments, representation); } } }; const onerror = function () { - callback(null, representation, type); + callback(streamId, mediaType, null, representation); }; urlLoader.load({request: request, success: onload, error: onerror}); @@ -340,12 +340,12 @@ function SegmentBaseLoader() { return request; } - function onLoaded(segments, representation, type) { - if (segments) { - eventBus.trigger(events.SEGMENTS_LOADED, {segments: segments, representation: representation, mediaType: type}); - } else { - eventBus.trigger(events.SEGMENTS_LOADED, {segments: null, representation: representation, mediaType: type, error: new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE)}); - } + function onLoaded(streamId, mediaType, segments, representation) { + eventBus.trigger(events.SEGMENTS_LOADED, { + segments: segments, + representation: representation, + error: segments ? undefined : new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE) + }, streamId, mediaType); } instance = { diff --git a/src/dash/WebmSegmentBaseLoader.js b/src/dash/WebmSegmentBaseLoader.js index 633397caac..d2c6967454 100644 --- a/src/dash/WebmSegmentBaseLoader.js +++ b/src/dash/WebmSegmentBaseLoader.js @@ -304,7 +304,7 @@ function WebmSegmentBaseLoader() { } } - function loadInitialization(representation, loadingInfo) { + function loadInitialization(streamId, mediaType, representation, loadingInfo) { checkConfig(); let request = null; let baseUrl = representation ? baseURLController.resolve(representation.path) : null; @@ -317,7 +317,7 @@ function WebmSegmentBaseLoader() { request: request, url: baseUrl ? baseUrl.url : undefined, init: true, - mediaType: representation && representation.adaptation ? representation.adaptation.type : null + mediaType: mediaType }; logger.info('Start loading initialization.'); @@ -327,15 +327,11 @@ function WebmSegmentBaseLoader() { const onload = function () { // note that we don't explicitly set rep.initialization as this // will be computed when all BaseURLs are resolved later - eventBus.trigger(events.INITIALIZATION_LOADED, { - representation: representation - }); + eventBus.trigger(events.INITIALIZATION_LOADED, { representation: representation }, streamId, mediaType); }; const onloadend = function () { - eventBus.trigger(events.INITIALIZATION_LOADED, { - representation: representation - }); + eventBus.trigger(events.INITIALIZATION_LOADED, { representation: representation }, streamId, mediaType); }; urlLoader.load({ @@ -347,7 +343,7 @@ function WebmSegmentBaseLoader() { logger.debug('Perform init load: ' + info.url); } - function loadSegments(representation, type, theRange, callback) { + function loadSegments(streamId, mediaType, representation, theRange, callback) { checkConfig(); let request = null; let baseUrl = representation ? baseURLController.resolve(representation.path) : null; @@ -363,7 +359,7 @@ function WebmSegmentBaseLoader() { request: request, url: media, init: false, - mediaType: representation && representation.adaptation ? representation.adaptation.type : null + mediaType: mediaType }; callback = !callback ? onLoaded : callback; @@ -376,12 +372,12 @@ function WebmSegmentBaseLoader() { const onload = function (response) { parseEbmlHeader(response, media, theRange, function (segments) { - callback(segments, representation, type); + callback(streamId, mediaType, segments, representation); }); }; const onloadend = function () { - callback(null, representation, type); + callback(streamId, mediaType, null, representation); }; urlLoader.load({ @@ -391,21 +387,12 @@ function WebmSegmentBaseLoader() { }); } - function onLoaded(segments, representation, type) { - if (segments) { - eventBus.trigger(events.SEGMENTS_LOADED, { - segments: segments, - representation: representation, - mediaType: type - }); - } else { - eventBus.trigger(events.SEGMENTS_LOADED, { - segments: null, - representation: representation, - mediaType: type, - error: new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE) - }); - } + function onLoaded(streamId, mediaType, segments, representation) { + eventBus.trigger(events.SEGMENTS_LOADED, { + segments: segments, + representation: representation, + error: segments ? undefined : new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE) + }, streamId, mediaType); } function getFragmentRequest(info) { diff --git a/src/dash/controllers/RepresentationController.js b/src/dash/controllers/RepresentationController.js index d091786b5c..c70bbdd1e9 100644 --- a/src/dash/controllers/RepresentationController.js +++ b/src/dash/controllers/RepresentationController.js @@ -43,7 +43,7 @@ function RepresentationController(config) { const playbackController = config.playbackController; const timelineConverter = config.timelineConverter; const type = config.type; - const streamId = config.streamId; + const streamInfo = config.streamInfo; const dashConstants = config.dashConstants; let instance, @@ -61,6 +61,14 @@ function RepresentationController(config) { eventBus.on(events.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, instance); } + function getStreamId() { + return streamInfo.id; + } + + function getType() { + return type; + } + function checkConfig() { if (!abrController || !dashMetrics || !playbackController || !timelineConverter) { throw new Error(Constants.MISSING_CONFIG_ERROR); @@ -86,7 +94,6 @@ function RepresentationController(config) { } function reset() { - eventBus.off(events.QUALITY_CHANGE_REQUESTED, onQualityChanged, instance); eventBus.off(events.REPRESENTATION_UPDATE_COMPLETED, onRepresentationUpdated, instance); eventBus.off(events.WALLCLOCK_TIME_UPDATED, onWallclockTimeUpdated, instance); @@ -95,14 +102,6 @@ function RepresentationController(config) { resetInitialSettings(); } - function getType() { - return type; - } - - function getStreamId() { - return streamId; - } - function updateData(newRealAdaptation, availableRepresentations, type, quality) { checkConfig(); @@ -177,10 +176,7 @@ function RepresentationController(config) { for (let i = 0, ln = voAvailableRepresentations.length; i < ln; i++) { updateRepresentation(voAvailableRepresentations[i], isDynamic); if (notifyUpdate) { - eventBus.trigger(events.REPRESENTATION_UPDATE_STARTED, { - sender: instance, - representation: voAvailableRepresentations[i] - }); + eventBus.trigger(events.REPRESENTATION_UPDATE_STARTED, { representation: voAvailableRepresentations[i] }, streamInfo.id, type); } } } @@ -193,16 +189,16 @@ function RepresentationController(config) { function startDataUpdate() { updating = true; - eventBus.trigger(events.DATA_UPDATE_STARTED, {sender: instance}); + eventBus.trigger(events.DATA_UPDATE_STARTED, {}, streamInfo.id, type); } function endDataUpdate(error) { updating = false; - let eventArg = {sender: instance, data: realAdaptation, currentRepresentation: currentVoRepresentation}; - if (error) { - eventArg.error = error; - } - eventBus.trigger(events.DATA_UPDATE_COMPLETED, eventArg); + eventBus.trigger(events.DATA_UPDATE_COMPLETED, { + data: realAdaptation, + currentRepresentation: currentVoRepresentation, + error: error + }, streamInfo.id, type); } function postponeUpdate(postponeTimePeriod) { @@ -223,14 +219,13 @@ function RepresentationController(config) { } function onRepresentationUpdated(e) { - if (e.sender.getType() !== getType() || e.sender.getStreamInfo().id !== streamId || !isUpdating()) return; + if (!isUpdating()) return; if (e.error) { endDataUpdate(e.error); return; } - let streamInfo = e.sender.getStreamInfo(); let r = e.representation; let manifestUpdateInfo = dashMetrics.getCurrentManifestUpdate(); let alreadyAdded = false; @@ -241,7 +236,7 @@ function RepresentationController(config) { if (r.adaptation.period.mpd.manifest.type === dashConstants.DYNAMIC && !r.adaptation.period.mpd.manifest.ignorePostponeTimePeriod && playbackController.getStreamController().getStreams().length <= 1) { // We must put things to sleep unless till e.g. the startTime calculation in ScheduleController.onLiveEdgeSearchCompleted fall after the segmentAvailabilityRange.start - postponeTimePeriod = getRepresentationUpdatePostponeTimePeriod(r, streamInfo); + postponeTimePeriod = getRepresentationUpdatePostponeTimePeriod(r); } if (postponeTimePeriod > 0) { @@ -278,7 +273,7 @@ function RepresentationController(config) { } } - function getRepresentationUpdatePostponeTimePeriod(representation, streamInfo) { + function getRepresentationUpdatePostponeTimePeriod(representation) { try { const streamController = playbackController.getStreamController(); const activeStreamInfo = streamController.getActiveStreamInfo(); @@ -305,8 +300,6 @@ function RepresentationController(config) { } function onQualityChanged(e) { - if (e.mediaType !== getType() || streamId !== e.streamInfo.id) return; - currentVoRepresentation = getRepresentationForQuality(e.newQuality); addRepresentationSwitch(); } @@ -322,14 +315,14 @@ function RepresentationController(config) { } instance = { + getStreamId: getStreamId, + getType: getType, getData: getData, isUpdating: isUpdating, updateData: updateData, updateRepresentation: updateRepresentation, getCurrentRepresentation: getCurrentRepresentation, getRepresentationForQuality: getRepresentationForQuality, - getType: getType, - getStreamId: getStreamId, reset: reset }; diff --git a/src/dash/controllers/SegmentBaseController.js b/src/dash/controllers/SegmentBaseController.js index 1c18a06bb0..8feadcf039 100644 --- a/src/dash/controllers/SegmentBaseController.js +++ b/src/dash/controllers/SegmentBaseController.js @@ -97,17 +97,17 @@ function SegmentBaseController(config) { function onInitSegmentBaseNeeded(e) { if (isWebM(e.mimeType)) { - webmSegmentBaseLoader.loadInitialization(e.representation); + webmSegmentBaseLoader.loadInitialization(e.streamId, e.mediaType, e.representation); } else { - segmentBaseLoader.loadInitialization(e.representation); + segmentBaseLoader.loadInitialization(e.streamId, e.mediaType, e.representation); } } function onSegmentsListSegmentBaseNeeded(e) { if (isWebM(e.mimeType)) { - webmSegmentBaseLoader.loadSegments(e.representation, e.mediaType, e.representation ? e.representation.indexRange : null, e.callback); + webmSegmentBaseLoader.loadSegments(e.streamId, e.mediaType, e.representation, e.representation ? e.representation.indexRange : null, e.callback); } else { - segmentBaseLoader.loadSegments(e.representation, e.mediaType, e.representation ? e.representation.indexRange : null, e.callback); + segmentBaseLoader.loadSegments(e.streamId, e.mediaType, e.representation, e.representation ? e.representation.indexRange : null, e.callback); } } diff --git a/src/dash/controllers/SegmentsController.js b/src/dash/controllers/SegmentsController.js index 7f276e6b74..00e0cdf800 100644 --- a/src/dash/controllers/SegmentsController.js +++ b/src/dash/controllers/SegmentsController.js @@ -41,6 +41,8 @@ function SegmentsController(config) { const events = config.events; const eventBus = config.eventBus; const dashConstants = config.dashConstants; + const streamInfo = config.streamInfo; + const type = config.type; let instance, getters; @@ -56,13 +58,23 @@ function SegmentsController(config) { getters[dashConstants.SEGMENT_BASE] = SegmentBaseGetter(context).create(config, isDynamic); } - function update(voRepresentation, type, mimeType, hasInitialization, hasSegments) { + function update(voRepresentation, mimeType, hasInitialization, hasSegments) { if (!hasInitialization) { - eventBus.trigger(events.SEGMENTBASE_INIT_REQUEST_NEEDED, {mimeType: mimeType, representation: voRepresentation}); + eventBus.trigger(events.SEGMENTBASE_INIT_REQUEST_NEEDED, { + streamId: streamInfo.id, + mediaType: type, + mimeType: mimeType, + representation: voRepresentation + }); } if (!hasSegments) { - eventBus.trigger(events.SEGMENTBASE_SEGMENTSLIST_REQUEST_NEEDED, {mimeType: mimeType, mediaType: type, representation: voRepresentation}); + eventBus.trigger(events.SEGMENTBASE_SEGMENTSLIST_REQUEST_NEEDED, { + streamId: streamInfo.id, + mediaType: type, + mimeType: mimeType, + representation: voRepresentation + }); } } diff --git a/src/mss/MssHandler.js b/src/mss/MssHandler.js index dd13804ff4..5110e05cda 100644 --- a/src/mss/MssHandler.js +++ b/src/mss/MssHandler.js @@ -157,7 +157,7 @@ function MssHandler(config) { // Notify init segment has been loaded eventBus.trigger(events.INIT_FRAGMENT_LOADED, { chunk: chunk - }); + }, mediaInfo.streamInfo.id, representation.adaptation.type); } catch (e) { config.errHandler.error(new DashJSError(e.code, e.message, e.data)); } diff --git a/src/offline/OfflineStream.js b/src/offline/OfflineStream.js index aca086c553..e86b684310 100644 --- a/src/offline/OfflineStream.js +++ b/src/offline/OfflineStream.js @@ -97,7 +97,11 @@ function OfflineStream(config) { */ function initialize(initStreamInfo) { streamInfo = initStreamInfo; - eventBus.on(events.DATA_UPDATE_COMPLETED, onDataUpdateCompleted, this); + eventBus.on(events.DATA_UPDATE_COMPLETED, onDataUpdateCompleted, instance); + } + + function getStreamId() { + return streamInfo.id; } /** @@ -239,9 +243,6 @@ function OfflineStream(config) { } function onDataUpdateCompleted(e) { - let repCtrl = e.sender; - if (!streamInfo || repCtrl.getStreamId() !== streamInfo.id) return; - if (e.currentRepresentation.segments && e.currentRepresentation.segments.length > 0) { representationsToUpdate.push(e.currentRepresentation); } @@ -249,7 +250,7 @@ function OfflineStream(config) { let sp; // data are ready fr stream processor, let's start download for (let i = 0; i < offlineStreamProcessors.length; i++ ) { - if (offlineStreamProcessors[i].getRepresentationController().getType() === repCtrl.getType()) { + if (offlineStreamProcessors[i].getRepresentationController().getType() === e.mediaType) { sp = offlineStreamProcessors[i]; break; } @@ -319,11 +320,12 @@ function OfflineStream(config) { deactivate(); resetInitialSettings(); - eventBus.off(events.DATA_UPDATE_COMPLETED, onDataUpdateCompleted, this); + eventBus.off(events.DATA_UPDATE_COMPLETED, onDataUpdateCompleted, instance); } instance = { initialize: initialize, + getStreamId: getStreamId, getMediaInfos: getMediaInfos, initializeAllMediasInfoList: initializeAllMediasInfoList, getStreamInfo: getStreamInfo, diff --git a/src/offline/OfflineStreamProcessor.js b/src/offline/OfflineStreamProcessor.js index e41e31cabd..74887e2527 100644 --- a/src/offline/OfflineStreamProcessor.js +++ b/src/offline/OfflineStreamProcessor.js @@ -98,7 +98,7 @@ function OfflineStreamProcessor(config) { }); representationController = RepresentationController(context).create({ - streamId: streamInfo.id, + streamInfo: streamInfo, type: type, abrController: abrController, dashMetrics: dashMetrics, diff --git a/src/streaming/SourceBufferSink.js b/src/streaming/SourceBufferSink.js index 36ad729075..d8273b9d8a 100644 --- a/src/streaming/SourceBufferSink.js +++ b/src/streaming/SourceBufferSink.js @@ -48,6 +48,7 @@ function SourceBufferSink(mediaSource, mediaInfo, onAppendedCallback, oldBuffer) const eventBus = EventBus(context).getInstance(); let instance, + type, logger, buffer, isAppendingInProgress, @@ -61,6 +62,7 @@ function SourceBufferSink(mediaSource, mediaInfo, onAppendedCallback, oldBuffer) logger = Debug(context).getInstance().getLogger(instance); isAppendingInProgress = false; + type = mediaInfo.type; const codec = mediaInfo.codec; try { // Safari claims to support anything starting 'application/mp4'. @@ -103,6 +105,10 @@ function SourceBufferSink(mediaSource, mediaInfo, onAppendedCallback, oldBuffer) } } + function getType() { + return type; + } + function reset(keepBuffer) { if (buffer) { if (typeof buffer.removeEventListener === 'function') { @@ -205,7 +211,7 @@ function SourceBufferSink(mediaSource, mediaInfo, onAppendedCallback, oldBuffer) buffer.appendWindowStart = 0; buffer.appendWindowEnd = appendWindowEnd; buffer.appendWindowStart = appendWindowStart; - logger.debug(`Updated append window for ${mediaInfo.type}. Set start to ${buffer.appendWindowStart} and end to ${buffer.appendWindowEnd}`); + logger.debug(`Updated append window. Set start to ${buffer.appendWindowStart} and end to ${buffer.appendWindowEnd}`); }); } @@ -357,7 +363,7 @@ function SourceBufferSink(mediaSource, mediaInfo, onAppendedCallback, oldBuffer) } function errHandler() { - logger.error('SourceBufferSink error', mediaInfo.type); + logger.error('SourceBufferSink error'); } function waitForUpdateEnd(callback) { @@ -369,6 +375,7 @@ function SourceBufferSink(mediaSource, mediaInfo, onAppendedCallback, oldBuffer) } instance = { + getType: getType, getAllBufferRanges: getAllBufferRanges, getBuffer: getBuffer, append: append, diff --git a/src/streaming/Stream.js b/src/streaming/Stream.js index 6442fe5ab0..b01e956578 100644 --- a/src/streaming/Stream.js +++ b/src/streaming/Stream.js @@ -62,12 +62,13 @@ function Stream(config) { const eventController = config.eventController; const mediaController = config.mediaController; const textController = config.textController; + const protectionController = config.protectionController; const videoModel = config.videoModel; const settings = config.settings; + let streamInfo = config.streamInfo; let instance, logger, - streamInfo, streamProcessors, isStreamInitialized, isStreamActivated, @@ -76,7 +77,6 @@ function Stream(config) { hasAudioTrack, updateError, isUpdating, - protectionController, fragmentController, thumbnailController, preloaded, @@ -105,6 +105,7 @@ function Stream(config) { boxParser = BoxParser(context).getInstance(); fragmentController = FragmentController(context).create({ + streamInfo: streamInfo, mediaPlayerModel: mediaPlayerModel, dashMetrics: dashMetrics, errHandler: errHandler, @@ -113,8 +114,11 @@ function Stream(config) { dashConstants: DashConstants, urlUtils: urlUtils }); + } + function initialize() { registerEvents(); + registerProtectionEvents(); } function registerEvents() { @@ -151,13 +155,8 @@ function Stream(config) { } } - function initialize(strInfo, prtctnController) { - streamInfo = strInfo; - if (strInfo) { - fragmentController.setStreamId(strInfo.id); - } - protectionController = prtctnController; - registerProtectionEvents(); + function getStreamId() { + return streamInfo ? streamInfo.id : null; } /** @@ -232,7 +231,6 @@ function Stream(config) { function resetInitialSettings() { deactivate(); - streamInfo = null; isStreamInitialized = false; hasVideoTrack = false; hasAudioTrack = false; @@ -253,6 +251,8 @@ function Stream(config) { fragmentController = null; } + streamInfo = null; + resetInitialSettings(); unRegisterEvents(); @@ -413,7 +413,7 @@ function Stream(config) { function createStreamProcessor(mediaInfo, allMediaForType, mediaSource, optionalSettings) { - let fragmentModel = fragmentController.getModel(getId(), mediaInfo ? mediaInfo.type : null); + let fragmentModel = fragmentController.getModel(mediaInfo ? mediaInfo.type : null); let streamProcessor = StreamProcessor(context).create({ streamInfo: streamInfo, @@ -713,14 +713,11 @@ function Stream(config) { } function onDataUpdateCompleted(e) { - if (!streamInfo || e.sender.getStreamId() !== streamInfo.id) return; - - updateError[e.sender.getType()] = e.error; + updateError[e.mediaType] = e.error; checkIfInitializationCompleted(); } function onInbandEvents(e) { - if (!streamInfo || e.sender.getStreamInfo().id !== streamInfo.id) return; addInbandEvents(e.events); } @@ -912,6 +909,7 @@ function Stream(config) { instance = { initialize: initialize, + getStreamId: getStreamId, activate: activate, deactivate: deactivate, isActive: isActive, diff --git a/src/streaming/StreamProcessor.js b/src/streaming/StreamProcessor.js index 3902c65ac4..49472dfe93 100644 --- a/src/streaming/StreamProcessor.js +++ b/src/streaming/StreamProcessor.js @@ -136,7 +136,7 @@ function StreamProcessor(config) { abrController.registerStreamType(type, instance); representationController = RepresentationController(context).create({ - streamId: streamInfo.id, + streamInfo: streamInfo, type: type, abrController: abrController, dashMetrics: dashMetrics, @@ -154,7 +154,7 @@ function StreamProcessor(config) { } scheduleController = ScheduleController(context).create({ - streamId: streamInfo.id, + streamInfo: streamInfo, type: type, mimeType: mimeType, adapter: adapter, @@ -175,6 +175,14 @@ function StreamProcessor(config) { bufferPruned = false; } + function getStreamId() { + return streamInfo.id; + } + + function getType() { + return type; + } + function resetInitialSettings() { mediaInfoArr = []; mediaInfo = null; @@ -231,8 +239,6 @@ function StreamProcessor(config) { function onDataUpdateCompleted(e) { - if (e.sender.getType() !== getType() || e.sender.getStreamId() !== streamInfo.id) return; - if (!e.error) { // Update representation if no error scheduleController.setCurrentRepresentation(adapter.convertDataToRepresentationInfo(e.currentRepresentation)); @@ -244,7 +250,6 @@ function StreamProcessor(config) { } function onQualityChanged(e) { - if (type !== e.mediaType || streamInfo.id !== e.streamInfo.id) return; let representationInfo = getRepresentationInfo(e.newQuality); scheduleController.setCurrentRepresentation(representationInfo); dashMetrics.pushPlayListTraceMetrics(new Date(), PlayListTrace.REPRESENTATION_SWITCH_STOP_REASON); @@ -252,18 +257,13 @@ function StreamProcessor(config) { } function onBufferLevelUpdated(e) { - if (e.streamId !== streamInfo.id || e.mediaType !== type) return; - dashMetrics.addBufferLevel(type, new Date(), e.bufferLevel * 1000); - if (!manifestModel.getValue().doNotUpdateDVRWindowOnBufferUpdated) { addDVRMetric(); } } function onBufferLevelStateChanged(e) { - if (e.streamId !== streamInfo.id || e.mediaType !== type) return; - dashMetrics.addBufferState(type, e.state, scheduleController.getBufferTarget()); if (e.state === MetricsConstants.BUFFER_EMPTY && !playbackController.isSeeking()) { // logger.info('Buffer is empty! Stalling!'); @@ -272,8 +272,6 @@ function StreamProcessor(config) { } function onBufferCleared(e) { - if (e.streamId !== streamInfo.id || e.mediaType !== type) return; - // Remove executed requests not buffered anymore fragmentModel.syncExecutedRequestsWithBufferedRange( bufferController.getBuffer().getAllBufferRanges(), @@ -293,10 +291,6 @@ function StreamProcessor(config) { dashMetrics.addDVRInfo(getType(), playbackController.getTime(), manifestInfo, range); } - function getType() { - return type; - } - function getRepresentationController() { return representationController; } @@ -425,8 +419,6 @@ function StreamProcessor(config) { } function onInitFragmentNeeded(e) { - if (!e.sender || e.mediaType !== type || e.streamId !== streamInfo.id) return; - if (adapter.getIsTextTrack(mimeType) && !textController.isTextEnabled()) return; if (bufferController && e.representationId) { @@ -439,12 +431,8 @@ function StreamProcessor(config) { } function onMediaFragmentNeeded(e) { - if (!e.sender || e.mediaType !== type || e.streamId !== streamInfo.id) { - return; - } let request; - // Don't schedule next fragments while pruning to avoid buffer inconsistencies if (!bufferController.getIsPruningInProgress()) { request = findNextRequest(e.seekTarget, e.replacement); @@ -536,7 +524,7 @@ function StreamProcessor(config) { })[0]; const events = handleInbandEvents(bytes, request, eventStreamMedia, eventStreamTrack); - eventBus.trigger(Events.INBAND_EVENTS, {sender: instance, events: events}); + eventBus.trigger(Events.INBAND_EVENTS, {events: events}, streamInfo.id); } } @@ -683,8 +671,6 @@ function StreamProcessor(config) { } function onSeekTarget(e) { - if (e.mediaType !== type || e.streamId !== streamInfo.id) return; - bufferingTime = e.time; scheduleController.setSeekTarget(e.time); } @@ -729,8 +715,9 @@ function StreamProcessor(config) { instance = { initialize: initialize, - isUpdating: isUpdating, + getStreamId: getStreamId, getType: getType, + isUpdating: isUpdating, getBufferController: getBufferController, getFragmentModel: getFragmentModel, getScheduleController: getScheduleController, diff --git a/src/streaming/controllers/AbrController.js b/src/streaming/controllers/AbrController.js index a2099d7cf7..b915d46916 100644 --- a/src/streaming/controllers/AbrController.js +++ b/src/streaming/controllers/AbrController.js @@ -91,14 +91,14 @@ function AbrController() { abandonmentStateDict[type] = abandonmentStateDict[type] || {}; abandonmentStateDict[type].state = MetricsConstants.ALLOW_LOAD; isUsingBufferOccupancyABRDict[type] = false; - eventBus.on(Events.LOADING_PROGRESS, onFragmentLoadProgress, this); + eventBus.on(Events.LOADING_PROGRESS, onFragmentLoadProgress, instance); if (type == Constants.VIDEO) { - eventBus.on(Events.QUALITY_CHANGE_RENDERED, onQualityChangeRendered, this); + eventBus.on(Events.QUALITY_CHANGE_RENDERED, onQualityChangeRendered, instance); droppedFramesHistory = droppedFramesHistory || DroppedFramesHistory(context).create(); setElementSize(); } - eventBus.on(Events.METRIC_ADDED, onMetricAdded, this); - eventBus.on(Events.PERIOD_SWITCH_COMPLETED, createAbrRulesCollection, this); + eventBus.on(Events.METRIC_ADDED, onMetricAdded, instance); + eventBus.on(Events.PERIOD_SWITCH_COMPLETED, createAbrRulesCollection, instance); throughputHistory = throughputHistory || ThroughputHistory(context).create({ settings: settings @@ -140,10 +140,10 @@ function AbrController() { resetInitialSettings(); - eventBus.off(Events.LOADING_PROGRESS, onFragmentLoadProgress, this); - eventBus.off(Events.QUALITY_CHANGE_RENDERED, onQualityChangeRendered, this); - eventBus.off(Events.METRIC_ADDED, onMetricAdded, this); - eventBus.off(Events.PERIOD_SWITCH_COMPLETED, createAbrRulesCollection, this); + eventBus.off(Events.LOADING_PROGRESS, onFragmentLoadProgress, instance); + eventBus.off(Events.QUALITY_CHANGE_RENDERED, onQualityChangeRendered, instance); + eventBus.off(Events.METRIC_ADDED, onMetricAdded, instance); + eventBus.off(Events.PERIOD_SWITCH_COMPLETED, createAbrRulesCollection, instance); if (abrRulesCollection) { abrRulesCollection.reset(); @@ -364,7 +364,10 @@ function AbrController() { logger.info('[' + type + '] switch from ' + oldQuality + ' to ' + newQuality + '/' + topQualityIdx + ' (buffer: ' + bufferLevel + ') ' + (reason ? JSON.stringify(reason) : '.')); } setQualityFor(type, id, newQuality); - eventBus.trigger(Events.QUALITY_CHANGE_REQUESTED, {mediaType: type, streamInfo: streamInfo, oldQuality: oldQuality, newQuality: newQuality, reason: reason}); + eventBus.trigger(Events.QUALITY_CHANGE_REQUESTED, { + oldQuality: oldQuality, + newQuality: newQuality, + reason: reason}, streamInfo.id, type); const bitrate = throughputHistory.getAverageThroughput(type); if (!isNaN(bitrate)) { domStorage.setSavedBitrateSettings(type, bitrate); diff --git a/src/streaming/controllers/BlacklistController.js b/src/streaming/controllers/BlacklistController.js index a006a197b0..63df45f6c1 100644 --- a/src/streaming/controllers/BlacklistController.js +++ b/src/streaming/controllers/BlacklistController.js @@ -35,6 +35,7 @@ import EventBus from '../../core/EventBus'; function BlackListController(config) { config = config || {}; + let instance; let blacklist = []; const eventBus = EventBus(this.context).getInstance(); @@ -56,12 +57,7 @@ function BlackListController(config) { blacklist.push(entry); - eventBus.trigger( - updateEventName, - { - entry: entry - } - ); + eventBus.trigger(updateEventName, { entry: entry }); } function onAddBlackList(e) { @@ -70,7 +66,7 @@ function BlackListController(config) { function setup() { if (addBlacklistEventName) { - eventBus.on(addBlacklistEventName, onAddBlackList, this); + eventBus.on(addBlacklistEventName, onAddBlackList, instance); } } @@ -78,13 +74,14 @@ function BlackListController(config) { blacklist = []; } - setup(); - - return { + instance = { add: add, contains: contains, reset: reset }; + + setup(); + return instance; } BlackListController.__dashjs_factory_name = 'BlackListController'; diff --git a/src/streaming/controllers/BufferController.js b/src/streaming/controllers/BufferController.js index 509afb2bbb..63bcabc083 100644 --- a/src/streaming/controllers/BufferController.js +++ b/src/streaming/controllers/BufferController.js @@ -125,6 +125,15 @@ function BufferController(config) { eventBus.on(Events.SOURCEBUFFER_REMOVE_COMPLETED, onRemoved, this); } + function getStreamId() { + return streamInfo.id; + } + + function getType() { + return type; + } + + function getRepresentationInfo(quality) { return adapter.convertDataToRepresentationInfo(representationController.getRepresentationForQuality(quality)); } @@ -190,8 +199,6 @@ function BufferController(config) { } function onInitFragmentLoaded(e) { - if (e.chunk.streamId !== streamInfo.id || e.chunk.mediaInfo.type !== type) return; - logger.info('Init fragment finished loading saving to', type + '\'s init cache'); initCache.save(e.chunk); logger.debug('Append Init fragment', type, ' with representationId:', e.chunk.representationId, ' and quality:', e.chunk.quality, ', data size:', e.chunk.bytes.byteLength); @@ -345,7 +352,7 @@ function BufferController(config) { } function onQualityChanged(e) { - if (e.streamInfo.id !== streamInfo.id || e.mediaType !== type || requiredQuality === e.newQuality) return; + if (requiredQuality === e.newQuality) return; updateBufferTimestampOffset(this.getRepresentationInfo(e.newQuality)); requiredQuality = e.newQuality; @@ -736,11 +743,7 @@ function BufferController(config) { } function onDataUpdateCompleted(e) { - if (e.sender.getStreamId() !== streamInfo.id || e.sender.getType() !== type) return; - if (e.error) return; - if (isBufferingCompleted) { - return; - } + if (e.error || isBufferingCompleted) return; updateBufferTimestampOffset(e.currentRepresentation); } @@ -778,10 +781,6 @@ function BufferController(config) { checkIfSufficientBuffer(); } - function getType() { - return type; - } - function getBuffer() { return buffer; } @@ -842,10 +841,7 @@ function BufferController(config) { function triggerEvent(eventType, data) { let payload = data || {}; - payload.sender = instance; - payload.mediaType = type; - payload.streamId = streamInfo.id; - eventBus.trigger(eventType, payload); + eventBus.trigger(eventType, payload, streamInfo.id, type); } function resetInitialSettings(errored, keepBuffers) { @@ -896,12 +892,13 @@ function BufferController(config) { } instance = { + initialize, + getStreamId, + getType, getBufferControllerType, getRepresentationInfo, - initialize, createBuffer, dischargePreBuffer, - getType, getBuffer, setBuffer, getBufferLevel, diff --git a/src/streaming/controllers/FragmentController.js b/src/streaming/controllers/FragmentController.js index aade9e87f5..606d44b50d 100644 --- a/src/streaming/controllers/FragmentController.js +++ b/src/streaming/controllers/FragmentController.js @@ -49,11 +49,11 @@ function FragmentController( config ) { const mediaPlayerModel = config.mediaPlayerModel; const dashMetrics = config.dashMetrics; const debug = Debug(context).getInstance(); + const streamInfo = config.streamInfo; let instance, logger, - fragmentModels, - streamId; + fragmentModels; function setup() { logger = debug.getLogger(instance); @@ -62,11 +62,16 @@ function FragmentController( config ) { eventBus.on(Events.FRAGMENT_LOADING_PROGRESS, onFragmentLoadingCompleted, instance); } - function getModel(streamId, type) { + function getStreamId() { + return streamInfo.id; + } + + function getModel(type) { let model = fragmentModels[type]; if (!model) { model = FragmentModel(context).create({ - streamId: streamId, + streamInfo: streamInfo, + type: type, dashMetrics: dashMetrics, fragmentLoader: FragmentLoader(context).create({ dashMetrics: dashMetrics, @@ -130,18 +135,16 @@ function FragmentController( config ) { const request = e.request; const bytes = e.response; const isInit = request.isInitializationRequest(); - const streamInfo = request.mediaInfo.streamInfo; - - if (streamInfo && streamInfo.id !== streamId) return; + const strInfo = request.mediaInfo.streamInfo; if (e.error) { - if (e.request.mediaType === Constants.AUDIO || e.request.mediaType === Constants.VIDEO || e.request.mediaType === Constants.FRAGMENTED_TEXT) { + if (request.mediaType === Constants.AUDIO || request.mediaType === Constants.VIDEO || request.mediaType === Constants.FRAGMENTED_TEXT) { // add service location to blacklist controller - only for audio or video. text should not set errors eventBus.trigger(Events.SERVICE_LOCATION_BLACKLIST_ADD, {entry: e.request.serviceLocation}); } } - if (!bytes || !streamInfo) { + if (!bytes || !strInfo) { logger.warn('No ' + request.mediaType + ' bytes to push or stream is inactive.'); return; } @@ -149,16 +152,12 @@ function FragmentController( config ) { eventBus.trigger(isInit ? Events.INIT_FRAGMENT_LOADED : Events.MEDIA_FRAGMENT_LOADED, { chunk: chunk, request: request - }); - } - - function setStreamId (id) { - streamId = id; + }, strInfo.id, request.mediaType); } instance = { + getStreamId: getStreamId, getModel: getModel, - setStreamId: setStreamId, reset: reset }; diff --git a/src/streaming/controllers/GapController.js b/src/streaming/controllers/GapController.js index 9815d584b6..9800a347cc 100644 --- a/src/streaming/controllers/GapController.js +++ b/src/streaming/controllers/GapController.js @@ -93,13 +93,13 @@ function GapController() { } function registerEvents() { - eventBus.on(Events.WALLCLOCK_TIME_UPDATED, onWallclockTimeUpdated, this); - eventBus.on(Events.BYTES_APPENDED_END_FRAGMENT, onBytesAppended, this); + eventBus.on(Events.WALLCLOCK_TIME_UPDATED, onWallclockTimeUpdated, instance); + eventBus.on(Events.BYTES_APPENDED_END_FRAGMENT, onBytesAppended, instance); } function unregisterEvents() { - eventBus.off(Events.WALLCLOCK_TIME_UPDATED, onWallclockTimeUpdated, this); - eventBus.off(Events.BYTES_APPENDED_END_FRAGMENT, onBytesAppended, this); + eventBus.off(Events.WALLCLOCK_TIME_UPDATED, onWallclockTimeUpdated, instance); + eventBus.off(Events.BYTES_APPENDED_END_FRAGMENT, onBytesAppended, instance); } function onBytesAppended() { diff --git a/src/streaming/controllers/ScheduleController.js b/src/streaming/controllers/ScheduleController.js index 6decb336f0..b947c09f63 100644 --- a/src/streaming/controllers/ScheduleController.js +++ b/src/streaming/controllers/ScheduleController.js @@ -50,7 +50,7 @@ function ScheduleController(config) { const abrController = config.abrController; const playbackController = config.playbackController; const textController = config.textController; - const streamId = config.streamId; + const streamInfo = config.streamInfo; const type = config.type; const mimeType = config.mimeType; const mediaController = config.mediaController; @@ -110,6 +110,14 @@ function ScheduleController(config) { eventBus.on(Events.BUFFERING_COMPLETED, onBufferingCompleted, this); } + function getType() { + return type; + } + + function getStreamId() { + return streamInfo.id; + } + function setCurrentRepresentation(representationInfo) { currentRepresentationInfo = representationInfo; } @@ -168,7 +176,7 @@ function ScheduleController(config) { const isReplacement = replaceRequestArray.length > 0; if (replacingBuffer || isNaN(lastInitQuality) || switchTrack || isReplacement || - hasTopQualityChanged(type, streamId) || + hasTopQualityChanged(type, streamInfo.id) || bufferLevelRule.execute(type, currentRepresentationInfo, hasVideoTrack)) { const getNextFragment = function () { if ((currentRepresentationInfo.quality !== lastInitQuality || switchTrack) && (!replacingBuffer)) { @@ -183,11 +191,8 @@ function ScheduleController(config) { logger.debug('Quality has changed, get init request for representationid = ' + currentRepresentationInfo.id); } eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, { - sender: instance, - streamId: streamId, - mediaType: type, representationId: currentRepresentationInfo.id - }); + }, streamInfo.id, type); lastInitQuality = currentRepresentationInfo.quality; checkPlaybackQuality = false; } else { @@ -196,20 +201,14 @@ function ScheduleController(config) { if (replacement && replacement.isInitializationRequest()) { // To be sure the specific init segment had not already been loaded eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, { - sender: instance, - streamId: streamId, - mediaType: type, representationId: replacement.representationId - }); + }, streamInfo.id, type); checkPlaybackQuality = false; } else { eventBus.trigger(Events.MEDIA_FRAGMENT_NEEDED, { - sender: instance, - streamId: streamId, - mediaType: type, seekTarget: seekTarget, replacement: replacement - }); + }, streamInfo.id, type); checkPlaybackQuality = true; } } @@ -339,7 +338,7 @@ function ScheduleController(config) { } function onStreamCompleted(e) { - if (e.request.mediaInfo.streamInfo.id !== streamId || e.request.mediaType !== type) return; + if (e.request.mediaInfo.streamInfo.id !== streamInfo.id || e.request.mediaType !== type) return; stop(); setFragmentProcessState(false); @@ -347,7 +346,7 @@ function ScheduleController(config) { } function onFragmentLoadingCompleted(e) { - if (e.request.mediaInfo.streamInfo.id !== streamId || e.request.mediaType !== type) return; + if (e.request.mediaInfo.streamInfo.id !== streamInfo.id || e.request.mediaType !== type) return; logger.info('OnFragmentLoadingCompleted - Url:', e.request ? e.request.url : 'undefined', e.request.range ? ', Range:' + e.request.range : ''); @@ -371,8 +370,6 @@ function ScheduleController(config) { } function onBytesAppended(e) { - if (e.streamId !== streamId || e.mediaType !== type) return; - if (replacingBuffer && !isNaN(e.startTime)) { replacingBuffer = false; fragmentModel.addExecutedRequest(mediaRequest); @@ -398,8 +395,6 @@ function ScheduleController(config) { } function onFragmentLoadingAbandoned(e) { - if (e.streamId !== streamId || e.mediaType !== type) return; - logger.info('onFragmentLoadingAbandoned request: ' + e.request.url + ' has been aborted'); if (!playbackController.isSeeking() && !switchTrack) { logger.info('onFragmentLoadingAbandoned request: ' + e.request.url + ' has to be downloaded again, origin is not seeking process or switch track call'); @@ -409,28 +404,22 @@ function ScheduleController(config) { startScheduleTimer(0); } - function onDataUpdateStarted(e) { - if (e.sender.getType() !== type || e.sender.getStreamId() !== streamId) return; + function onDataUpdateStarted(/*e*/) { // stop(); } - function onBufferingCompleted(e) { - if (type !== e.mediaType || streamId !== e.streamId) return; + function onBufferingCompleted(/*e*/) { stop(); } function onBufferCleared(e) { - if (e.streamId !== streamId || e.mediaType !== type) return; - // (Re)start schedule once buffer has been pruned after a QuotaExceededError if (e.hasEnoughSpaceToAppend && e.quotaExceeded) { start(); } } - function onQuotaExceeded(e) { - if (e.streamId !== streamId || e.mediaType !== type) return; - + function onQuotaExceeded(/*e*/) { // Stop scheduler (will be restarted once buffer is pruned) stop(); setFragmentProcessState(false); @@ -489,14 +478,6 @@ function ScheduleController(config) { return bufferLevelRule.getBufferTarget(type, currentRepresentationInfo); } - function getType() { - return type; - } - - function getStreamId() { - return streamId; - } - function resetInitialSettings() { checkPlaybackQuality = true; isFragmentProcessingInProgress = false; diff --git a/src/streaming/controllers/StreamController.js b/src/streaming/controllers/StreamController.js index 55b3bf7572..b9f0558a7e 100644 --- a/src/streaming/controllers/StreamController.js +++ b/src/streaming/controllers/StreamController.js @@ -137,33 +137,33 @@ function StreamController() { } function registerEvents() { - eventBus.on(Events.PLAYBACK_TIME_UPDATED, onPlaybackTimeUpdated, this); - eventBus.on(Events.PLAYBACK_SEEKING, onPlaybackSeeking, this); - eventBus.on(Events.GAP_CAUSED_PLAYBACK_SEEK, onGapCausedPlaybackSeek, this); - eventBus.on(Events.PLAYBACK_ERROR, onPlaybackError, this); - eventBus.on(Events.PLAYBACK_STARTED, onPlaybackStarted, this); - eventBus.on(Events.PLAYBACK_PAUSED, onPlaybackPaused, this); - eventBus.on(Events.PLAYBACK_ENDED, onEnded, this); - eventBus.on(Events.MANIFEST_UPDATED, onManifestUpdated, this); - eventBus.on(Events.STREAM_BUFFERING_COMPLETED, onStreamBufferingCompleted, this); - eventBus.on(Events.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, this); - eventBus.on(Events.TIME_SYNCHRONIZATION_COMPLETED, onTimeSyncCompleted, this); - eventBus.on(MediaPlayerEvents.METRIC_ADDED, onMetricAdded, this); + eventBus.on(Events.PLAYBACK_TIME_UPDATED, onPlaybackTimeUpdated, instance); + eventBus.on(Events.PLAYBACK_SEEKING, onPlaybackSeeking, instance); + eventBus.on(Events.GAP_CAUSED_PLAYBACK_SEEK, onGapCausedPlaybackSeek, instance); + eventBus.on(Events.PLAYBACK_ERROR, onPlaybackError, instance); + eventBus.on(Events.PLAYBACK_STARTED, onPlaybackStarted, instance); + eventBus.on(Events.PLAYBACK_PAUSED, onPlaybackPaused, instance); + eventBus.on(Events.PLAYBACK_ENDED, onEnded, instance); + eventBus.on(Events.MANIFEST_UPDATED, onManifestUpdated, instance); + eventBus.on(Events.STREAM_BUFFERING_COMPLETED, onStreamBufferingCompleted, instance); + eventBus.on(Events.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, instance); + eventBus.on(Events.TIME_SYNCHRONIZATION_COMPLETED, onTimeSyncCompleted, instance); + eventBus.on(MediaPlayerEvents.METRIC_ADDED, onMetricAdded, instance); } function unRegisterEvents() { - eventBus.off(Events.PLAYBACK_TIME_UPDATED, onPlaybackTimeUpdated, this); - eventBus.off(Events.PLAYBACK_SEEKING, onPlaybackSeeking, this); - eventBus.off(Events.GAP_CAUSED_PLAYBACK_SEEK, onGapCausedPlaybackSeek, this); - eventBus.off(Events.PLAYBACK_ERROR, onPlaybackError, this); - eventBus.off(Events.PLAYBACK_STARTED, onPlaybackStarted, this); - eventBus.off(Events.PLAYBACK_PAUSED, onPlaybackPaused, this); - eventBus.off(Events.PLAYBACK_ENDED, onEnded, this); - eventBus.off(Events.MANIFEST_UPDATED, onManifestUpdated, this); - eventBus.off(Events.STREAM_BUFFERING_COMPLETED, onStreamBufferingCompleted, this); - eventBus.off(Events.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, this); - eventBus.off(Events.TIME_SYNCHRONIZATION_COMPLETED, onTimeSyncCompleted, this); - eventBus.off(MediaPlayerEvents.METRIC_ADDED, onMetricAdded, this); + eventBus.off(Events.PLAYBACK_TIME_UPDATED, onPlaybackTimeUpdated, instance); + eventBus.off(Events.PLAYBACK_SEEKING, onPlaybackSeeking, instance); + eventBus.off(Events.GAP_CAUSED_PLAYBACK_SEEK, onGapCausedPlaybackSeek, instance); + eventBus.off(Events.PLAYBACK_ERROR, onPlaybackError, instance); + eventBus.off(Events.PLAYBACK_STARTED, onPlaybackStarted, instance); + eventBus.off(Events.PLAYBACK_PAUSED, onPlaybackPaused, instance); + eventBus.off(Events.PLAYBACK_ENDED, onEnded, instance); + eventBus.off(Events.MANIFEST_UPDATED, onManifestUpdated, instance); + eventBus.off(Events.STREAM_BUFFERING_COMPLETED, onStreamBufferingCompleted, instance); + eventBus.off(Events.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, instance); + eventBus.off(Events.TIME_SYNCHRONIZATION_COMPLETED, onTimeSyncCompleted, instance); + eventBus.off(MediaPlayerEvents.METRIC_ADDED, onMetricAdded, instance); } /* @@ -644,11 +644,13 @@ function StreamController() { eventController: eventController, mediaController: mediaController, textController: textController, + protectionController: protectionController, videoModel: videoModel, + streamInfo: streamInfo, settings: settings }); streams.push(stream); - stream.initialize(streamInfo, protectionController); + stream.initialize(); } else { stream.updateData(streamInfo); } diff --git a/src/streaming/metrics/controllers/MetricsCollectionController.js b/src/streaming/metrics/controllers/MetricsCollectionController.js index a53cbae1fe..477efeb280 100644 --- a/src/streaming/metrics/controllers/MetricsCollectionController.js +++ b/src/streaming/metrics/controllers/MetricsCollectionController.js @@ -36,8 +36,8 @@ import MetricsReportingEvents from '../MetricsReportingEvents'; function MetricsCollectionController(config) { config = config || {}; + let instance; let metricsControllers = {}; - let context = this.context; let eventBus = config.eventBus; const events = config.events; @@ -92,20 +92,21 @@ function MetricsCollectionController(config) { } function setup() { - eventBus.on(events.MANIFEST_UPDATED, update); - eventBus.on(events.STREAM_TEARDOWN_COMPLETE, resetMetricsControllers); + eventBus.on(events.MANIFEST_UPDATED, update, instance); + eventBus.on(events.STREAM_TEARDOWN_COMPLETE, resetMetricsControllers, instance); } function reset() { - eventBus.off(events.MANIFEST_UPDATED, update); - eventBus.off(events.STREAM_TEARDOWN_COMPLETE, resetMetricsControllers); + eventBus.off(events.MANIFEST_UPDATED, update, instance); + eventBus.off(events.STREAM_TEARDOWN_COMPLETE, resetMetricsControllers, instance); } - setup(); - - return { + instance = { reset: reset }; + + setup(); + return instance; } MetricsCollectionController.__dashjs_factory_name = 'MetricsCollectionController'; diff --git a/src/streaming/models/FragmentModel.js b/src/streaming/models/FragmentModel.js index d72a0b3b73..5d08bc08a8 100644 --- a/src/streaming/models/FragmentModel.js +++ b/src/streaming/models/FragmentModel.js @@ -45,7 +45,8 @@ function FragmentModel(config) { const dashMetrics = config.dashMetrics; const fragmentLoader = config.fragmentLoader; const debug = config.debug; - const streamId = config.streamId; + const streamInfo = config.streamInfo; + const type = config.type; let instance, logger, @@ -60,6 +61,14 @@ function FragmentModel(config) { eventBus.on(events.LOADING_ABANDONED, onLoadingAborted, instance); } + function getStreamId() { + return streamInfo.id; + } + + function getType() { + return type; + } + function isFragmentLoaded(request) { const isEqualComplete = function (req1, req2) { return ((req1.action === FragmentRequest.ACTION_COMPLETE) && (req1.action === req2.action)); @@ -211,10 +220,7 @@ function FragmentModel(config) { } function loadCurrentFragment(request) { - eventBus.trigger(events.FRAGMENT_LOADING_STARTED, { - streamId: streamId, - request: request - }); + eventBus.trigger(events.FRAGMENT_LOADING_STARTED, { request: request }, streamInfo.id, type); fragmentLoader.load(request); } @@ -285,7 +291,7 @@ function FragmentModel(config) { response: e.response, error: e.error, sender: this - }); + }, streamInfo.id, type); } function onLoadingInProgress(e) { @@ -296,13 +302,13 @@ function FragmentModel(config) { response: e.response, error: e.error, sender: this - }); + }, streamInfo.id, type); } function onLoadingAborted(e) { if (e.sender !== fragmentLoader) return; - eventBus.trigger(events.FRAGMENT_LOADING_ABANDONED, { streamId: streamId, request: e.request, mediaType: e.mediaType }); + eventBus.trigger(events.FRAGMENT_LOADING_ABANDONED, { request: e.request }, streamInfo.id, type); } function resetInitialSettings() { @@ -326,6 +332,8 @@ function FragmentModel(config) { } instance = { + getStreamId: getStreamId, + getType: getType, getRequests: getRequests, isFragmentLoaded: isFragmentLoaded, isFragmentLoadedOrPending: isFragmentLoadedOrPending, diff --git a/src/streaming/text/NotFragmentedTextBufferController.js b/src/streaming/text/NotFragmentedTextBufferController.js index a7cbeeb858..0a2712943b 100644 --- a/src/streaming/text/NotFragmentedTextBufferController.js +++ b/src/streaming/text/NotFragmentedTextBufferController.js @@ -145,8 +145,6 @@ function NotFragmentedTextBufferController(config) { } function onDataUpdateCompleted(e) { - if (e.sender.getStreamId() !== streamInfo.id || e.sender.getType() !== type || e.error) return; - if (initCache.extract(streamInfo.id, e.currentRepresentation.id) !== null) { return; } @@ -156,11 +154,8 @@ function NotFragmentedTextBufferController(config) { // // Text data file is contained in initialization segment eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, { - sender: instance, - streamId: streamInfo.id, - mediaType: type, representationId: e.currentRepresentation.id - }); + }, streamInfo.id, type); } function appendInitSegment(representationId) { @@ -169,7 +164,7 @@ function NotFragmentedTextBufferController(config) { } function onInitFragmentLoaded(e) { - if (e.chunk.streamId !== streamInfo.id || e.chunk.mediaInfo.type !== type || (!e.chunk.bytes)) return; + if (!e.chunk.bytes) return; initCache.save(e.chunk); buffer.append(e.chunk); diff --git a/src/streaming/thumbnail/ThumbnailController.js b/src/streaming/thumbnail/ThumbnailController.js index 9ac5c60cae..9ae602c8d2 100644 --- a/src/streaming/thumbnail/ThumbnailController.js +++ b/src/streaming/thumbnail/ThumbnailController.js @@ -39,6 +39,7 @@ import { replaceTokenForTemplate, unescapeDollarsInTemplate } from '../../dash/u function ThumbnailController(config) { const context = this.context; + const streamInfo = config.streamInfo; let instance, thumbnailTracks; @@ -46,7 +47,7 @@ function ThumbnailController(config) { function setup() { reset(); thumbnailTracks = ThumbnailTracks(context).create({ - streamInfo: config.streamInfo, + streamInfo: streamInfo, adapter: config.adapter, baseURLController: config.baseURLController, timelineConverter: config.timelineConverter, @@ -57,6 +58,10 @@ function ThumbnailController(config) { }); } + function getStreamId() { + return streamInfo.id; + } + function provideThumbnail(time, callback) { if (typeof callback !== 'function') { @@ -144,6 +149,7 @@ function ThumbnailController(config) { } instance = { + getStreamId: getStreamId, provide: provideThumbnail, setTrackByIndex: setTrackByIndex, getCurrentTrackIndex: getCurrentTrackIndex, diff --git a/src/streaming/thumbnail/ThumbnailTracks.js b/src/streaming/thumbnail/ThumbnailTracks.js index b959855511..67ca602079 100644 --- a/src/streaming/thumbnail/ThumbnailTracks.js +++ b/src/streaming/thumbnail/ThumbnailTracks.js @@ -69,6 +69,7 @@ function ThumbnailTracks(config) { boxParser = BoxParser(context).getInstance(); indexHandler = DashHandler(context).create({ + streamInfo: streamInfo, timelineConverter: timelineConverter, baseURLController: baseURLController, debug: debug, @@ -172,10 +173,11 @@ function ThumbnailTracks(config) { if (useSegmentBase) { eventBus.trigger(Events.SEGMENTBASE_SEGMENTSLIST_REQUEST_NEEDED, { - mimeType: mediaInfo.mimeType, + streamId: streamInfo.id, mediaType: Constants.IMAGE, + mimeType: mediaInfo.mimeType, representation: representation, - callback: function (segments, representation) { + callback: function (streamId, mediaType, segments, representation) { let cache = []; segments = normalizeSegments(segments, representation); track.segmentDuration = segments[0].duration; //assume all segments have the same duration From c05dea2c66dae7e1ad3ba7f76d369070a3fd478f Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 19 Aug 2020 14:51:42 +0200 Subject: [PATCH 02/22] Refactor EventBus: update unit tests --- test/unit/Streaming.StreamProcessor.js | 2 +- test/unit/dash.DashHandler.js | 2 + ...sh.controllers.RepresentationController.js | 6 +- .../dash.controllers.SegmentsController.js | 1 + test/unit/streaming.Stream.js | 75 +++++-------------- .../streaming.controllers.BufferController.js | 56 -------------- ...treaming.controllers.FragmentController.js | 11 +-- test/unit/streaming.models.FragmentModel.js | 18 ++++- ....text.NotFragmentedTextBufferController.js | 25 ------- ...streaming.thumbnail.ThumbnailController.js | 11 ++- 10 files changed, 55 insertions(+), 152 deletions(-) diff --git a/test/unit/Streaming.StreamProcessor.js b/test/unit/Streaming.StreamProcessor.js index ef2056f406..5be9a1aa8b 100644 --- a/test/unit/Streaming.StreamProcessor.js +++ b/test/unit/Streaming.StreamProcessor.js @@ -35,7 +35,7 @@ describe('StreamProcessor', function () { let streamProcessor = null; beforeEach(function () { - streamProcessor = StreamProcessor(context).create({}); + streamProcessor = StreamProcessor(context).create({streamInfo: streamInfo}); }); afterEach(function () { diff --git a/test/unit/dash.DashHandler.js b/test/unit/dash.DashHandler.js index 1e2126048b..bc3a0060b3 100644 --- a/test/unit/dash.DashHandler.js +++ b/test/unit/dash.DashHandler.js @@ -32,6 +32,8 @@ describe('DashHandler', function () { const dashMetricsMock = new DashMetricsMock(); const config = { + streamInfo: { id: 'id' }, + type: 'video', mimeType: streamProcessor.getMediaInfo().mimeType, timelineConverter: timelineConverter, baseURLController: baseURLController, diff --git a/test/unit/dash.controllers.RepresentationController.js b/test/unit/dash.controllers.RepresentationController.js index 12fa1b3b43..301c43303e 100644 --- a/test/unit/dash.controllers.RepresentationController.js +++ b/test/unit/dash.controllers.RepresentationController.js @@ -49,7 +49,9 @@ describe('RepresentationController', function () { describe('Config not correctly passed', function () { beforeEach(function () { - representationController = RepresentationController(context).create({ events: Events, + representationController = RepresentationController(context).create({ + streamInfo: streamProcessor.getStreamInfo(), + events: Events, eventBus: eventBus }); }); @@ -74,12 +76,12 @@ describe('RepresentationController', function () { describe('Config correctly passed', function () { beforeEach(function () { representationController = RepresentationController(context).create({ + streamInfo: streamProcessor.getStreamInfo(), abrController: abrControllerMock, timelineConverter: timelineConverter, playbackController: playbackControllerMock, dashMetrics: dashMetricsMock, type: testType, - streamId: streamProcessor.getStreamInfo().id, events: Events, eventBus: eventBus, dashConstants: DashConstants diff --git a/test/unit/dash.controllers.SegmentsController.js b/test/unit/dash.controllers.SegmentsController.js index 5597039fe6..0d6faf5d1a 100644 --- a/test/unit/dash.controllers.SegmentsController.js +++ b/test/unit/dash.controllers.SegmentsController.js @@ -29,6 +29,7 @@ describe('SegmentsController', function () { const eventBus = EventBus(context).getInstance(); const segmentsController = SegmentsController(context).create({ + streamInfo: {streamId: 'streamId'}, dashMetrics: dashMetricsMock, mediaPlayerModel: mediaPlayerModel, errHandler: errHandler, diff --git a/test/unit/streaming.Stream.js b/test/unit/streaming.Stream.js index c85010479e..4de28534c1 100644 --- a/test/unit/streaming.Stream.js +++ b/test/unit/streaming.Stream.js @@ -58,6 +58,7 @@ describe('Stream', function () { describe('Well initialized', function () { beforeEach(function () { stream = Stream(context).create({ + streamInfo: streamInfo, errHandler: errHandlerMock, manifestModel: manifestModelMock, adapter: adapterMock, @@ -69,6 +70,7 @@ describe('Stream', function () { timelineConverter: timelineConverter, dashMetrics: dashMetricsMock, textController: textControllerMock, + protectionController: {}, videoModel: videoModelMock, settings: settings}); }); @@ -96,57 +98,57 @@ describe('Stream', function () { }); it('should return an null when getId is called but streamInfo attribute is null or undefined', () => { + stream.reset(); const id = stream.getId(); - expect(id).to.be.null; // jshint ignore:line }); it('should return an NaN when getStartTime is called but streamInfo attribute is null or undefined', () => { + stream.reset(); const startTime = stream.getStartTime(); - expect(startTime).to.be.NaN; // jshint ignore:line }); it('should return an NaN when getDuration is called but streamInfo attribute is null or undefined', () => { + stream.reset(); const duration = stream.getDuration(); - expect(duration).to.be.NaN; // jshint ignore:line }); it('should return null false isMediaCodecCompatible is called but stream attribute is undefined', () => { + stream.reset(); const isCompatible = stream.isMediaCodecCompatible(); - expect(isCompatible).to.be.false; // jshint ignore:line }); it('should return false when isMediaCodecCompatible is called but stream attribute is an empty object', () => { + stream.reset(); const isCompatible = stream.isMediaCodecCompatible({}); - expect(isCompatible).to.be.false; // jshint ignore:line }); it('should return false when isMediaCodecCompatible is called with a correct stream attribute', () => { + stream.reset(); const isCompatible = stream.isMediaCodecCompatible(new StreamMock()); - expect(isCompatible).to.be.false; // jshint ignore:line }); it('should return null when isProtectionCompatible is called but stream attribute is undefined', () => { + stream.reset(); const isCompatible = stream.isProtectionCompatible(); - expect(isCompatible).to.be.false; // jshint ignore:line }); it('should return an empty array when getBitrateListFor is called but no stream processor is defined', () => { + stream.reset(); const bitrateList = stream.getBitrateListFor(''); - expect(bitrateList).to.be.instanceOf(Array); // jshint ignore:line expect(bitrateList).to.be.empty; // jshint ignore:line }); it('should return an empty array when getBitrateListFor, for image type, is called but thumbnailController is not defined', () => { + stream.reset(); const bitrateList = stream.getBitrateListFor(Constants.IMAGE); - expect(bitrateList).to.be.instanceOf(Array); // jshint ignore:line expect(bitrateList).to.be.empty; // jshint ignore:line }); @@ -164,7 +166,7 @@ describe('Stream', function () { }); it('License expired behavior', function () { - stream.initialize(null,{}); + stream.initialize(); eventBus.trigger(Events.KEY_STATUSES_CHANGED, {data: null, error: new DashJSError(ProtectionErrors.KEY_STATUS_CHANGED_EXPIRED_ERROR_CODE, ProtectionErrors.KEY_STATUS_CHANGED_EXPIRED_ERROR_MESSAGE)}); @@ -173,7 +175,7 @@ describe('Stream', function () { }); it('No Licenser server url defined behavior', function () { - stream.initialize(null,{}); + stream.initialize(); eventBus.trigger(Events.LICENSE_REQUEST_COMPLETE, {data: null, error: new DashJSError(ProtectionErrors.MEDIA_KEY_MESSAGE_NO_LICENSE_SERVER_URL_ERROR_CODE, ProtectionErrors.MEDIA_KEY_MESSAGE_NO_LICENSE_SERVER_URL_ERROR_MESSAGE)}); @@ -182,7 +184,7 @@ describe('Stream', function () { }); it('Licenser request error behavior', function () { - stream.initialize(null,{}); + stream.initialize(); eventBus.trigger(Events.LICENSE_REQUEST_COMPLETE, {data: null, error: new DashJSError(ProtectionErrors.MEDIA_KEY_MESSAGE_LICENSER_ERROR_CODE, ProtectionErrors.MEDIA_KEY_MESSAGE_LICENSER_ERROR_MESSAGE)}); @@ -191,7 +193,7 @@ describe('Stream', function () { }); it('CDM Access denied behavior', function () { - stream.initialize(null,{}); + stream.initialize(); eventBus.trigger(Events.KEY_SYSTEM_SELECTED, {data: null, error: new DashJSError(ProtectionErrors.KEY_SYSTEM_ACCESS_DENIED_ERROR_CODE, ProtectionErrors.KEY_SYSTEM_ACCESS_DENIED_ERROR_MESSAGE)}); @@ -200,7 +202,7 @@ describe('Stream', function () { }); it('Unable to create key session behavior', function () { - stream.initialize(null,{}); + stream.initialize(); eventBus.trigger(Events.KEY_SESSION_CREATED, {data: null, error: new DashJSError(ProtectionErrors.KEY_SESSION_CREATED_ERROR_CODE, ProtectionErrors.KEY_SESSION_CREATED_ERROR_MESSAGE)}); @@ -209,7 +211,7 @@ describe('Stream', function () { }); it('should return preloaded to true after a call to preload without parameters', () => { - stream.initialize(streamInfo, {}); + stream.initialize(); let isPreloaded = stream.getPreloaded(); @@ -223,52 +225,11 @@ describe('Stream', function () { }); it('should return undefined when getThumbnailController is called without a call to initializeMediaForType', () => { - stream.initialize(streamInfo, {}); + stream.initialize(); const thumbnailController = stream.getThumbnailController(); expect(thumbnailController).to.be.undefined; // jshint ignore:line }); - - // it('should returns an array of buffers when activate is called', function () { - // stream.initialize(streamInfo, {}); - - // const buffers = stream.activate(); - - // expect(buffers).to.be.instanceOf(Object); // jshint ignore:line - // expect(buffers).to.not.equal({}); // jshint ignore:line - // }); - }); - - describe('Not well initialized with no config parameter', function () { - beforeEach(function () { - stream = Stream(context).create(); - }); - - afterEach(function () { - stream.reset(); - }); - - it('should throw an error when getBitrateListFor is called and config object is not defined', function () { - expect(stream.getBitrateListFor.bind(stream)).to.be.throw(Constants.MISSING_CONFIG_ERROR); - }); - }); - - describe('Not well initialized with empty config parameter', function () { - beforeEach(function () { - stream = Stream(context).create({}); - }); - - afterEach(function () { - stream.reset(); - }); - - it('should throw an error when getBitrateListFor is called and config object has not been set properly', function () { - expect(stream.getBitrateListFor.bind(stream)).to.be.throw(Constants.MISSING_CONFIG_ERROR); - }); - - it('should throw an error when activate is called and config object has not been set properly', function () { - expect(stream.activate.bind(stream)).to.be.throw(Constants.MISSING_CONFIG_ERROR); - }); }); }); diff --git a/test/unit/streaming.controllers.BufferController.js b/test/unit/streaming.controllers.BufferController.js index 7319ae603e..8c85ad72a0 100644 --- a/test/unit/streaming.controllers.BufferController.js +++ b/test/unit/streaming.controllers.BufferController.js @@ -160,30 +160,6 @@ describe('BufferController', function () { bufferController.createBuffer(mediaInfo); }); - it('should not append data to source buffer if wrong streamId', function (done) { - const event = { - chunk: { - streamId: 'wrong', - mediaInfo: { - type: 'video' - }, - bytes: 'initData', - quality: 2, - representationId: 'representationId' - } - }; - const onInitDataLoaded = function () { - eventBus.off(Events.INIT_FRAGMENT_LOADED, onInitDataLoaded); - expect(mediaSourceMock.buffers[0].chunk).to.be.null; // jshint ignore:line - done(); - }; - eventBus.on(Events.INIT_FRAGMENT_LOADED, onInitDataLoaded, this); - - expect(mediaSourceMock.buffers[0].chunk).to.be.null; // jshint ignore:line - // send event - eventBus.trigger(Events.INIT_FRAGMENT_LOADED, event); - }); - it('should append data to source buffer ', function (done) { const event = { chunk: { @@ -325,38 +301,6 @@ describe('BufferController', function () { }; }); - it('should not update buffer timestamp offset - wrong stream processor id', function () { - expect(mediaSourceMock.buffers[0].timestampOffset).to.equal(1); - - const event = { - newQuality: 2, - mediaType: testType, - streamInfo: { - id: 'wrongid' - } - }; - - // send event - eventBus.trigger(Events.QUALITY_CHANGE_REQUESTED, event); - expect(mediaSourceMock.buffers[0].timestampOffset).to.equal(1); - }); - - it('should not update buffer timestamp offset - wrong media type', function () { - expect(mediaSourceMock.buffers[0].timestampOffset).to.equal(1); - - const event = { - streamInfo: { - id: streamInfo.id - }, - newQuality: 2, - mediaType: 'wrongMediaType' - }; - - // send event - eventBus.trigger(Events.QUALITY_CHANGE_REQUESTED, event); - expect(mediaSourceMock.buffers[0].timestampOffset).to.equal(1); - }); - it('should not update buffer timestamp offset - wrong quality', function () { expect(mediaSourceMock.buffers[0].timestampOffset).to.equal(1); diff --git a/test/unit/streaming.controllers.FragmentController.js b/test/unit/streaming.controllers.FragmentController.js index 67607ba864..a786667b2c 100644 --- a/test/unit/streaming.controllers.FragmentController.js +++ b/test/unit/streaming.controllers.FragmentController.js @@ -16,6 +16,7 @@ describe('FragmentController', function () { const mediaPlayerModelMock = new MediaPlayerModelMock(); const settings = Settings(context).getInstance(); const fragmentController = FragmentController(context).create({ + streamInfo: { id: 'streamId' }, mediaPlayerModel: mediaPlayerModelMock, settings: settings }); @@ -23,7 +24,7 @@ describe('FragmentController', function () { Events.extend(MediaPlayerEvents); it('should create or return model for a given media type', function () { - videoFragmentModel = fragmentController.getModel('streamId', 'video'); + videoFragmentModel = fragmentController.getModel('video'); expect(videoFragmentModel).to.exist; // jshint ignore:line }); @@ -31,11 +32,11 @@ describe('FragmentController', function () { const context1 = 1; const context2 = 2; - const model1 = fragmentController.getModel('streamId', context1); - const model2 = fragmentController.getModel('streamId', context2); + const model1 = fragmentController.getModel(context1); + const model2 = fragmentController.getModel(context2); - expect(fragmentController.getModel('streamId', context1)).to.be.equal(model1); - expect(fragmentController.getModel('streamId', context2)).to.be.equal(model2); + expect(fragmentController.getModel(context1)).to.be.equal(model1); + expect(fragmentController.getModel(context2)).to.be.equal(model2); }); it('should trigger INIT_FRAGMENT_LOADED event when an init segment download is completed.', function (done) { diff --git a/test/unit/streaming.models.FragmentModel.js b/test/unit/streaming.models.FragmentModel.js index 69b0b93282..abfa1ba0f2 100644 --- a/test/unit/streaming.models.FragmentModel.js +++ b/test/unit/streaming.models.FragmentModel.js @@ -25,7 +25,13 @@ describe('FragmentModel', function () { const context = {}; const debug = Debug(context).getInstance(); const eventBus = EventBus(context).getInstance(); - let fragmentModel = FragmentModel(context).create({dashMetrics: new DashMetricsMock(),eventBus: eventBus, events: Events, debug: debug}); + let fragmentModel = FragmentModel(context).create({ + streamInfo: { id: 'streamId' }, + type: 'video', + dashMetrics: new DashMetricsMock(), + eventBus: eventBus, + events: Events, + debug: debug}); it('should not have any loading, executed, canceled or failed requests', function () { const expectedValue = 0; @@ -71,7 +77,15 @@ describe('FragmentModel', function () { let clock; beforeEach(function () { - fragmentModel = FragmentModel(context).create({dashMetrics: new DashMetricsMock(), fragmentLoader: loader, eventBus: eventBus, events: Events, debug: debug}); + fragmentModel = FragmentModel(context).create({ + streamInfo: { id: 'streamId' }, + type: 'video', + dashMetrics: new DashMetricsMock(), + fragmentLoader: loader, + eventBus: eventBus, + events: Events, + debug: debug + }); clock = sinon.useFakeTimers(); setTimeout(function () { diff --git a/test/unit/streaming.text.NotFragmentedTextBufferController.js b/test/unit/streaming.text.NotFragmentedTextBufferController.js index b23a21423c..ec3ad55ceb 100644 --- a/test/unit/streaming.text.NotFragmentedTextBufferController.js +++ b/test/unit/streaming.text.NotFragmentedTextBufferController.js @@ -151,31 +151,6 @@ describe('NotFragmentedTextBufferController', function () { describe('Event INIT_FRAGMENT_LOADED Handler', function () { - it('should not append data to buffer - wrong stream id', function (done) { - - notFragmentedTextBufferController.createBuffer(mockMediaInfoArr); - const buffer = notFragmentedTextBufferController.getBuffer().getBuffer(); - - let event = { - chunk: { - streamId: 'wrong', - mediaInfo: { - type: testType - }, - bytes: 'data' - } - }; - - let onEvent = function () { - eventBus.off(Events.INIT_FRAGMENT_LOADED, onEvent); - expect(buffer.chunk).to.not.exist; // jshint ignore:line - - done(); - }; - eventBus.on(Events.INIT_FRAGMENT_LOADED, onEvent, this); - eventBus.trigger(Events.INIT_FRAGMENT_LOADED, event); - }); - it('should not append data to buffer - no bytes', function (done) { notFragmentedTextBufferController.createBuffer(mockMediaInfoArr); diff --git a/test/unit/streaming.thumbnail.ThumbnailController.js b/test/unit/streaming.thumbnail.ThumbnailController.js index fa889de588..35f5a872ce 100644 --- a/test/unit/streaming.thumbnail.ThumbnailController.js +++ b/test/unit/streaming.thumbnail.ThumbnailController.js @@ -256,10 +256,13 @@ describe('Thumbnails', function () { }); it('addTracks method doesn\'t add any track if config not set properly', function () { - thumbnailTracks = ThumbnailTracks(context).create({debug: Debug(context).getInstance(), - eventBus: EventBus(context).getInstance(), - events: Events, - dashConstants: DashConstants}); + thumbnailTracks = ThumbnailTracks(context).create({ + streamInfo: streamInfo, + debug: Debug(context).getInstance(), + eventBus: EventBus(context).getInstance(), + events: Events, + dashConstants: DashConstants + }); thumbnailTracks.initialize(); const tracks = thumbnailTracks.getTracks(); expect(tracks).to.be.empty; // jshint ignore:line From 155e84d4cafe611c230407589f76bb566ac894b1 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 19 Aug 2020 15:03:37 +0200 Subject: [PATCH 03/22] [temp] execute functional tests on this branch --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 12eeff075e..ce94431fb5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -93,6 +93,7 @@ workflows: commit-workflow: jobs: - build + - functional-tests scheduled-workflow: triggers: - schedule: From 70ed08fbdb3357a83c0448cacfdf2e6858374c54 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 19 Aug 2020 16:00:04 +0200 Subject: [PATCH 04/22] [temp] PR #3372 functional tests --- test/functional/config/applications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/config/applications.js b/test/functional/config/applications.js index 12ec48b82e..57583315ac 100644 --- a/test/functional/config/applications.js +++ b/test/functional/config/applications.js @@ -1,4 +1,4 @@ define({ local:'http://localhost:3000/samples/functional-tests/index.html', - remote:'reference.dashif.org/dash.js/nightly/samples/functional-tests/index.html', + remote:'orange-opensource.github.io/dash.js/pr3372/samples/functional-tests/index.html', }); From 1c3e1f5203fddfd1d72779cd7702578ea7926f6d Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 19 Aug 2020 16:33:21 +0200 Subject: [PATCH 05/22] Refactor EventBus: fix MssHandler --- src/mss/MssHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mss/MssHandler.js b/src/mss/MssHandler.js index 5110e05cda..80aa60262d 100644 --- a/src/mss/MssHandler.js +++ b/src/mss/MssHandler.js @@ -132,7 +132,7 @@ function MssHandler(config) { } function onInitFragmentNeeded(e) { - let streamProcessor = getStreamProcessor(e.sender.getType()); + let streamProcessor = getStreamProcessor(e.mediaType); if (!streamProcessor) return; // Create init segment request From 6a128026d8769ff5065778d0a510a5a22ac0d4c2 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 19 Aug 2020 16:33:57 +0200 Subject: [PATCH 06/22] Revert "[temp] execute functional tests on this branch" This reverts commit 155e84d4cafe611c230407589f76bb566ac894b1. --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ce94431fb5..12eeff075e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -93,7 +93,6 @@ workflows: commit-workflow: jobs: - build - - functional-tests scheduled-workflow: triggers: - schedule: From 826f7d7080d9ac36dd4ed175d1efeaaebed31ebe Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 19 Aug 2020 16:34:05 +0200 Subject: [PATCH 07/22] Revert "[temp] PR #3372 functional tests" This reverts commit 70ed08fbdb3357a83c0448cacfdf2e6858374c54. --- test/functional/config/applications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/config/applications.js b/test/functional/config/applications.js index 57583315ac..12ec48b82e 100644 --- a/test/functional/config/applications.js +++ b/test/functional/config/applications.js @@ -1,4 +1,4 @@ define({ local:'http://localhost:3000/samples/functional-tests/index.html', - remote:'orange-opensource.github.io/dash.js/pr3372/samples/functional-tests/index.html', + remote:'reference.dashif.org/dash.js/nightly/samples/functional-tests/index.html', }); From f6e8d7724e8206b961a73a080104a6f1dbce10db Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Fri, 21 Aug 2020 08:41:20 +0200 Subject: [PATCH 08/22] Register PLAYBACK_ENDED event with high priority in order to be notified before application (that can stop and reset the player before event handlers) --- src/streaming/controllers/PlaybackController.js | 2 +- src/streaming/controllers/StreamController.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/streaming/controllers/PlaybackController.js b/src/streaming/controllers/PlaybackController.js index 61078582fc..11a9efb6ae 100644 --- a/src/streaming/controllers/PlaybackController.js +++ b/src/streaming/controllers/PlaybackController.js @@ -93,7 +93,7 @@ function PlaybackController() { eventBus.on(Events.BUFFER_LEVEL_STATE_CHANGED, onBufferLevelStateChanged, this); eventBus.on(Events.PLAYBACK_PROGRESS, onPlaybackProgression, this); eventBus.on(Events.PLAYBACK_TIME_UPDATED, onPlaybackProgression, this); - eventBus.on(Events.PLAYBACK_ENDED, onPlaybackEnded, this); + eventBus.on(Events.PLAYBACK_ENDED, onPlaybackEnded, this, EventBus.EVENT_PRIORITY_HIGH); eventBus.on(Events.STREAM_INITIALIZING, onStreamInitializing, this); if (playOnceInitialized) { diff --git a/src/streaming/controllers/StreamController.js b/src/streaming/controllers/StreamController.js index b9f0558a7e..e5a7bcc7ae 100644 --- a/src/streaming/controllers/StreamController.js +++ b/src/streaming/controllers/StreamController.js @@ -143,7 +143,7 @@ function StreamController() { eventBus.on(Events.PLAYBACK_ERROR, onPlaybackError, instance); eventBus.on(Events.PLAYBACK_STARTED, onPlaybackStarted, instance); eventBus.on(Events.PLAYBACK_PAUSED, onPlaybackPaused, instance); - eventBus.on(Events.PLAYBACK_ENDED, onEnded, instance); + eventBus.on(Events.PLAYBACK_ENDED, onEnded, instance, EventBus.EVENT_PRIORITY_HIGH); eventBus.on(Events.MANIFEST_UPDATED, onManifestUpdated, instance); eventBus.on(Events.STREAM_BUFFERING_COMPLETED, onStreamBufferingCompleted, instance); eventBus.on(Events.MANIFEST_VALIDITY_CHANGED, onManifestValidityChanged, instance); From f5985cd6e728fd9446162efa791b36ebc5671a92 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Mon, 31 Aug 2020 14:19:03 +0200 Subject: [PATCH 09/22] fix build error --- src/streaming/controllers/ScheduleController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/streaming/controllers/ScheduleController.js b/src/streaming/controllers/ScheduleController.js index 774422f136..ef8158fd8e 100644 --- a/src/streaming/controllers/ScheduleController.js +++ b/src/streaming/controllers/ScheduleController.js @@ -342,7 +342,7 @@ function ScheduleController(config) { stop(); setFragmentProcessState(false); - logger.info(`Stream ${streamId} is complete`); + logger.info(`Stream ${streamInfo.id} is complete`); } function onFragmentLoadingCompleted(e) { From 60fd2c5f04221d054301539bd97ea62db15bab4c Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Mon, 31 Aug 2020 14:20:08 +0200 Subject: [PATCH 10/22] do not check stream id and media type in event handlers --- src/streaming/Stream.js | 4 +--- src/streaming/StreamProcessor.js | 1 - src/streaming/controllers/BufferController.js | 2 -- .../controllers/ScheduleController.js | 4 +--- src/streaming/models/FragmentModel.js | 2 +- .../text/NotFragmentedTextBufferController.js | 2 +- test/unit/helpers/VOHelper.js | 5 ++++ .../streaming.controllers.BufferController.js | 24 ------------------- 8 files changed, 9 insertions(+), 35 deletions(-) diff --git a/src/streaming/Stream.js b/src/streaming/Stream.js index 3ee5f00a6c..8c11315c66 100644 --- a/src/streaming/Stream.js +++ b/src/streaming/Stream.js @@ -689,9 +689,7 @@ function Stream(config) { return buffers; } - function onBufferingCompleted(e) { - if (e.streamId !== streamInfo.id) return; - + function onBufferingCompleted() { let processors = getProcessors(); const ln = processors.length; diff --git a/src/streaming/StreamProcessor.js b/src/streaming/StreamProcessor.js index 465097a382..5c5af7614d 100644 --- a/src/streaming/StreamProcessor.js +++ b/src/streaming/StreamProcessor.js @@ -510,7 +510,6 @@ function StreamProcessor(config) { function onMediaFragmentLoaded(e) { const chunk = e.chunk; - if (chunk.streamId !== streamInfo.id || chunk.mediaInfo.type != type) return; const bytes = chunk.bytes; const quality = chunk.quality; diff --git a/src/streaming/controllers/BufferController.js b/src/streaming/controllers/BufferController.js index 63bcabc083..385ab92852 100644 --- a/src/streaming/controllers/BufferController.js +++ b/src/streaming/controllers/BufferController.js @@ -222,7 +222,6 @@ function BufferController(config) { function onMediaFragmentLoaded(e) { const chunk = e.chunk; - if (chunk.streamId !== streamInfo.id || chunk.mediaInfo.type !== type) return; if (replacingBuffer) { mediaChunk = chunk; @@ -748,7 +747,6 @@ function BufferController(config) { } function onStreamCompleted(e) { - if (e.request.mediaInfo.streamInfo.id !== streamInfo.id || e.request.mediaType !== type) return; lastIndex = e.request.index; checkIfBufferingCompleted(); } diff --git a/src/streaming/controllers/ScheduleController.js b/src/streaming/controllers/ScheduleController.js index ef8158fd8e..f7a20f32e6 100644 --- a/src/streaming/controllers/ScheduleController.js +++ b/src/streaming/controllers/ScheduleController.js @@ -337,9 +337,7 @@ function ScheduleController(config) { } } - function onStreamCompleted(e) { - if (e.request.mediaInfo.streamInfo.id !== streamInfo.id || e.request.mediaType !== type) return; - + function onStreamCompleted() { stop(); setFragmentProcessState(false); logger.info(`Stream ${streamInfo.id} is complete`); diff --git a/src/streaming/models/FragmentModel.js b/src/streaming/models/FragmentModel.js index 5d08bc08a8..998eab27ee 100644 --- a/src/streaming/models/FragmentModel.js +++ b/src/streaming/models/FragmentModel.js @@ -207,7 +207,7 @@ function FragmentModel(config) { logger.debug('STREAM_COMPLETED'); eventBus.trigger(events.STREAM_COMPLETED, { request: request - }); + }, request.mediaInfo.streamInfo.id, request.mediaType); break; case FragmentRequest.ACTION_DOWNLOAD: addSchedulingInfoMetrics(request, FRAGMENT_MODEL_LOADING); diff --git a/src/streaming/text/NotFragmentedTextBufferController.js b/src/streaming/text/NotFragmentedTextBufferController.js index 0a2712943b..b88feea14e 100644 --- a/src/streaming/text/NotFragmentedTextBufferController.js +++ b/src/streaming/text/NotFragmentedTextBufferController.js @@ -173,7 +173,7 @@ function NotFragmentedTextBufferController(config) { eventBus.trigger(Events.STREAM_COMPLETED, { request: e.request - }); + }, streamInfo.id, type); } function getRangeAt() { diff --git a/test/unit/helpers/VOHelper.js b/test/unit/helpers/VOHelper.js index 2079e10b67..67b42ae50f 100644 --- a/test/unit/helpers/VOHelper.js +++ b/test/unit/helpers/VOHelper.js @@ -86,6 +86,11 @@ class VoHelper { req.url = 'https://dash.akamaized.net/envivio/dashpr/clear/video4/Header.m4s'; req.startTime = NaN; req.duration = NaN; + req.mediaInfo = { + streamInfo: { + id: 'streamId' + } + } if (type === HTTPRequest.MEDIA_SEGMENT_TYPE) { req.url = 'https://dash.akamaized.net/envivio/dashpr/clear/video4/0.m4s'; diff --git a/test/unit/streaming.controllers.BufferController.js b/test/unit/streaming.controllers.BufferController.js index 8c85ad72a0..3a333cde13 100644 --- a/test/unit/streaming.controllers.BufferController.js +++ b/test/unit/streaming.controllers.BufferController.js @@ -221,30 +221,6 @@ describe('BufferController', function () { bufferController.createBuffer(mediaInfo); }); - it('should not append data to source buffer if wrong stream id', function (done) { - const event = { - chunk: { - streamId: 'wrong', - mediaInfo: { - type: 'video' - }, - bytes: 'data', - quality: 2, - representationId: 'representationId' - } - }; - const onMediaFragmentLoaded = function () { - eventBus.off(Events.MEDIA_FRAGMENT_LOADED, onMediaFragmentLoaded); - expect(mediaSourceMock.buffers[0].chunk).to.be.null; // jshint ignore:line - done(); - }; - eventBus.on(Events.MEDIA_FRAGMENT_LOADED, onMediaFragmentLoaded, this); - - expect(mediaSourceMock.buffers[0].chunk).to.be.null; // jshint ignore:line - // send event - eventBus.trigger(Events.MEDIA_FRAGMENT_LOADED, event); - }); - it('should append data to source buffer ', function (done) { const event = { chunk: { From 6f8526aa8c1ec435b264224bec009a6515da3454 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Tue, 15 Sep 2020 15:45:56 +0200 Subject: [PATCH 11/22] fix regression on SegmentBaseLoader --- src/dash/SegmentBaseLoader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dash/SegmentBaseLoader.js b/src/dash/SegmentBaseLoader.js index 6813f84880..2da7db79be 100644 --- a/src/dash/SegmentBaseLoader.js +++ b/src/dash/SegmentBaseLoader.js @@ -250,7 +250,7 @@ function SegmentBaseLoader() { let segs = []; let count = 0; let offset = (sidx.offset || info.range.start) + sidx.size; - const tmpCallback = function (result) { + const tmpCallback = function (streamId, mediaType, result) { if (result) { segs = segs.concat(result); count++; From 8acb1a3386019e2ce5d375422655ed9beb8d27b0 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Tue, 15 Sep 2020 17:32:09 +0200 Subject: [PATCH 12/22] EventBus: add filters (streamId, mediaType...) parameter in trigger() function --- src/core/EventBus.js | 16 ++----- src/dash/DashHandler.js | 15 ++++-- src/dash/SegmentBaseLoader.js | 23 ++++++--- src/dash/WebmSegmentBaseLoader.js | 23 ++++++--- .../controllers/RepresentationController.js | 23 ++++++--- src/mss/MssHandler.js | 7 +-- src/streaming/StreamProcessor.js | 5 +- src/streaming/controllers/AbrController.js | 12 +++-- src/streaming/controllers/BufferController.js | 2 +- .../controllers/FragmentController.js | 11 +++-- .../controllers/ScheduleController.js | 22 +++++---- src/streaming/models/FragmentModel.js | 47 ++++++++++++------- .../text/NotFragmentedTextBufferController.js | 14 +++--- 13 files changed, 137 insertions(+), 83 deletions(-) diff --git a/src/core/EventBus.js b/src/core/EventBus.js index d1e94fc080..099d56d50f 100644 --- a/src/core/EventBus.js +++ b/src/core/EventBus.js @@ -82,7 +82,7 @@ function EventBus() { handlers[type][idx] = null; } - function trigger(type, payload = {}, streamId = undefined, mediaType = undefined) { + function trigger(type, payload = {}, filters = {}) { if (!type || !handlers[type]) return; payload = payload || {}; @@ -90,21 +90,11 @@ function EventBus() { if (payload.hasOwnProperty('type')) throw new Error('\'type\' is a reserved word for event dispatching'); payload.type = type; - if (streamId) { - payload.streamId = streamId; - } - if (mediaType) { - payload.mediaType = mediaType; - } handlers[type] = handlers[type].filter((item) => item); const eventHandlers = handlers[type].filter(item => { - if (streamId && item.streamId && item.streamId !== streamId) { - return false; - } - if (mediaType && item.mediaType && item.mediaType !== mediaType) { - return false; - } + if (filters.streamId && item.streamId && item.streamId !== filters.streamId) return false; + if (filters.mediaType && item.mediaType && item.mediaType !== filters.mediaType) return false; return true; }); diff --git a/src/dash/DashHandler.js b/src/dash/DashHandler.js index c02a37d674..c7adcfbc8e 100644 --- a/src/dash/DashHandler.js +++ b/src/dash/DashHandler.js @@ -198,7 +198,10 @@ function DashHandler(config) { // If representation has initialization and segments information, REPRESENTATION_UPDATE_COMPLETED can be triggered immediately // otherwise, it means that a request has to be made to get initialization and/or segments informations if (hasInitialization && hasSegments) { - eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, { representation: voRepresentation }, streamInfo.id, type); + eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, + { representation: voRepresentation }, + { streamId: streamInfo.id, mediaType: type } + ); } else { segmentsController.update(voRepresentation, selectedMimeType, hasInitialization, hasSegments); } @@ -359,7 +362,10 @@ function DashHandler(config) { const representation = e.representation; if (!representation.segments) return; - eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, { representation: representation }, streamInfo.id, type); + eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, + { representation: representation }, + { streamId: streamInfo.id, mediaType: type } + ); } function onSegmentsLoaded(e) { @@ -416,7 +422,10 @@ function DashHandler(config) { return; } - eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, { representation: representation }, streamInfo.id, type); + eventBus.trigger(events.REPRESENTATION_UPDATE_COMPLETED, + { representation: representation }, + { streamId: streamInfo.id, mediaType: type } + ); } function onDynamicStreamCompleted() { diff --git a/src/dash/SegmentBaseLoader.js b/src/dash/SegmentBaseLoader.js index 2da7db79be..9668fff815 100644 --- a/src/dash/SegmentBaseLoader.js +++ b/src/dash/SegmentBaseLoader.js @@ -166,7 +166,10 @@ function SegmentBaseLoader() { representation.range = initRange; // note that we don't explicitly set rep.initialization as this // will be computed when all BaseURLs are resolved later - eventBus.trigger(events.INITIALIZATION_LOADED, { representation: representation }, streamId, mediaType); + eventBus.trigger(events.INITIALIZATION_LOADED, + { representation: representation }, + { streamId: streamId, mediaType: mediaType } + ); } else { info.range.end = info.bytesLoaded + info.bytesToLoad; loadInitialization(streamId, mediaType, representation, info); @@ -174,7 +177,10 @@ function SegmentBaseLoader() { }; const onerror = function () { - eventBus.trigger(events.INITIALIZATION_LOADED, { representation: representation }); + eventBus.trigger(events.INITIALIZATION_LOADED, + { representation: representation }, + { streamId: streamId, mediaType: mediaType } + ); }; urlLoader.load({request: request, success: onload, error: onerror}); @@ -341,11 +347,14 @@ function SegmentBaseLoader() { } function onLoaded(streamId, mediaType, segments, representation) { - eventBus.trigger(events.SEGMENTS_LOADED, { - segments: segments, - representation: representation, - error: segments ? undefined : new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE) - }, streamId, mediaType); + eventBus.trigger(events.SEGMENTS_LOADED, + { + segments: segments, + representation: representation, + error: segments ? undefined : new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE) + }, + { streamId: streamId, mediaType: mediaType } + ); } instance = { diff --git a/src/dash/WebmSegmentBaseLoader.js b/src/dash/WebmSegmentBaseLoader.js index d2c6967454..888912bcd5 100644 --- a/src/dash/WebmSegmentBaseLoader.js +++ b/src/dash/WebmSegmentBaseLoader.js @@ -327,11 +327,17 @@ function WebmSegmentBaseLoader() { const onload = function () { // note that we don't explicitly set rep.initialization as this // will be computed when all BaseURLs are resolved later - eventBus.trigger(events.INITIALIZATION_LOADED, { representation: representation }, streamId, mediaType); + eventBus.trigger(events.INITIALIZATION_LOADED, + { representation: representation }, + { streamId: streamId, mediaType: mediaType } + ); }; const onloadend = function () { - eventBus.trigger(events.INITIALIZATION_LOADED, { representation: representation }, streamId, mediaType); + eventBus.trigger(events.INITIALIZATION_LOADED, + { representation: representation }, + { streamId: streamId, mediaType: mediaType } + ); }; urlLoader.load({ @@ -388,11 +394,14 @@ function WebmSegmentBaseLoader() { } function onLoaded(streamId, mediaType, segments, representation) { - eventBus.trigger(events.SEGMENTS_LOADED, { - segments: segments, - representation: representation, - error: segments ? undefined : new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE) - }, streamId, mediaType); + eventBus.trigger(events.SEGMENTS_LOADED, + { + segments: segments, + representation: representation, + error: segments ? undefined : new DashJSError(errors.SEGMENT_BASE_LOADER_ERROR_CODE, errors.SEGMENT_BASE_LOADER_ERROR_MESSAGE) + }, + { streamId: streamId, mediaType: mediaType } + ); } function getFragmentRequest(info) { diff --git a/src/dash/controllers/RepresentationController.js b/src/dash/controllers/RepresentationController.js index 0db4c4bf62..9022a818cb 100644 --- a/src/dash/controllers/RepresentationController.js +++ b/src/dash/controllers/RepresentationController.js @@ -176,7 +176,10 @@ function RepresentationController(config) { for (let i = 0, ln = voAvailableRepresentations.length; i < ln; i++) { updateRepresentation(voAvailableRepresentations[i], isDynamic); if (notifyUpdate) { - eventBus.trigger(events.REPRESENTATION_UPDATE_STARTED, { representation: voAvailableRepresentations[i] }, streamInfo.id, type); + eventBus.trigger(events.REPRESENTATION_UPDATE_STARTED, + { representation: voAvailableRepresentations[i] }, + { streamId: streamInfo.id, mediaType: type } + ); } } } @@ -189,16 +192,22 @@ function RepresentationController(config) { function startDataUpdate() { updating = true; - eventBus.trigger(events.DATA_UPDATE_STARTED, {}, streamInfo.id, type); + eventBus.trigger(events.DATA_UPDATE_STARTED, + {}, + { streamId: streamInfo.id, mediaType: type } + ); } function endDataUpdate(error) { updating = false; - eventBus.trigger(events.DATA_UPDATE_COMPLETED, { - data: realAdaptation, - currentRepresentation: currentVoRepresentation, - error: error - }, streamInfo.id, type); + eventBus.trigger(events.DATA_UPDATE_COMPLETED, + { + data: realAdaptation, + currentRepresentation: currentVoRepresentation, + error: error + }, + { streamId: streamInfo.id, mediaType: type } + ); } function postponeUpdate(postponeTimePeriod) { diff --git a/src/mss/MssHandler.js b/src/mss/MssHandler.js index 80aa60262d..a8caa06ceb 100644 --- a/src/mss/MssHandler.js +++ b/src/mss/MssHandler.js @@ -155,9 +155,10 @@ function MssHandler(config) { chunk.bytes = mssFragmentProcessor.generateMoov(representation); // Notify init segment has been loaded - eventBus.trigger(events.INIT_FRAGMENT_LOADED, { - chunk: chunk - }, mediaInfo.streamInfo.id, representation.adaptation.type); + eventBus.trigger(events.INIT_FRAGMENT_LOADED, + { chunk: chunk }, + { streamId: mediaInfo.streamInfo.id, mediaType: representation.adaptation.type } + ); } catch (e) { config.errHandler.error(new DashJSError(e.code, e.message, e.data)); } diff --git a/src/streaming/StreamProcessor.js b/src/streaming/StreamProcessor.js index 5c5af7614d..a117812574 100644 --- a/src/streaming/StreamProcessor.js +++ b/src/streaming/StreamProcessor.js @@ -527,7 +527,10 @@ function StreamProcessor(config) { })[0]; const events = handleInbandEvents(bytes, request, eventStreamMedia, eventStreamTrack); - eventBus.trigger(Events.INBAND_EVENTS, {events: events}, streamInfo.id); + eventBus.trigger(Events.INBAND_EVENTS, + { events: events }, + { streamId: streamInfo.id } + ); } } diff --git a/src/streaming/controllers/AbrController.js b/src/streaming/controllers/AbrController.js index b915d46916..aef35632a0 100644 --- a/src/streaming/controllers/AbrController.js +++ b/src/streaming/controllers/AbrController.js @@ -364,10 +364,14 @@ function AbrController() { logger.info('[' + type + '] switch from ' + oldQuality + ' to ' + newQuality + '/' + topQualityIdx + ' (buffer: ' + bufferLevel + ') ' + (reason ? JSON.stringify(reason) : '.')); } setQualityFor(type, id, newQuality); - eventBus.trigger(Events.QUALITY_CHANGE_REQUESTED, { - oldQuality: oldQuality, - newQuality: newQuality, - reason: reason}, streamInfo.id, type); + eventBus.trigger(Events.QUALITY_CHANGE_REQUESTED, + { + oldQuality: oldQuality, + newQuality: newQuality, + reason: reason + }, + { streamId: streamInfo.id, mediaType: type } + ); const bitrate = throughputHistory.getAverageThroughput(type); if (!isNaN(bitrate)) { domStorage.setSavedBitrateSettings(type, bitrate); diff --git a/src/streaming/controllers/BufferController.js b/src/streaming/controllers/BufferController.js index e1479afb9e..d60c07024e 100644 --- a/src/streaming/controllers/BufferController.js +++ b/src/streaming/controllers/BufferController.js @@ -839,7 +839,7 @@ function BufferController(config) { function triggerEvent(eventType, data) { let payload = data || {}; - eventBus.trigger(eventType, payload, streamInfo.id, type); + eventBus.trigger(eventType, payload, { streamId: streamInfo.id, mediaType: type }); } function resetInitialSettings(errored, keepBuffers) { diff --git a/src/streaming/controllers/FragmentController.js b/src/streaming/controllers/FragmentController.js index 606d44b50d..a50a923b52 100644 --- a/src/streaming/controllers/FragmentController.js +++ b/src/streaming/controllers/FragmentController.js @@ -149,10 +149,13 @@ function FragmentController( config ) { return; } const chunk = createDataChunk(bytes, request, streamInfo.id, e.type !== Events.FRAGMENT_LOADING_PROGRESS); - eventBus.trigger(isInit ? Events.INIT_FRAGMENT_LOADED : Events.MEDIA_FRAGMENT_LOADED, { - chunk: chunk, - request: request - }, strInfo.id, request.mediaType); + eventBus.trigger(isInit ? Events.INIT_FRAGMENT_LOADED : Events.MEDIA_FRAGMENT_LOADED, + { + chunk: chunk, + request: request + }, + { streamId: strInfo.id, mediaType: request.mediaType } + ); } instance = { diff --git a/src/streaming/controllers/ScheduleController.js b/src/streaming/controllers/ScheduleController.js index 759e1ede22..98b285024a 100644 --- a/src/streaming/controllers/ScheduleController.js +++ b/src/streaming/controllers/ScheduleController.js @@ -190,9 +190,10 @@ function ScheduleController(config) { } else { logger.debug('Quality has changed, get init request for representationid = ' + currentRepresentationInfo.id); } - eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, { - representationId: currentRepresentationInfo.id - }, streamInfo.id, type); + eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, + { representationId: currentRepresentationInfo.id }, + { streamId: streamInfo.id, mediaType: type } + ); lastInitQuality = currentRepresentationInfo.quality; checkPlaybackQuality = false; } else { @@ -200,15 +201,16 @@ function ScheduleController(config) { if (replacement && replacement.isInitializationRequest()) { // To be sure the specific init segment had not already been loaded - eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, { - representationId: replacement.representationId - }, streamInfo.id, type); + eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, + { representationId: replacement.representationId }, + { streamId: streamInfo.id, mediaType: type } + ); checkPlaybackQuality = false; } else { - eventBus.trigger(Events.MEDIA_FRAGMENT_NEEDED, { - seekTarget: seekTarget, - replacement: replacement - }, streamInfo.id, type); + eventBus.trigger(Events.MEDIA_FRAGMENT_NEEDED, + { seekTarget: seekTarget, replacement: replacement }, + { streamId: streamInfo.id, mediaType: type } + ); checkPlaybackQuality = true; } } diff --git a/src/streaming/models/FragmentModel.js b/src/streaming/models/FragmentModel.js index 998eab27ee..8771982a14 100644 --- a/src/streaming/models/FragmentModel.js +++ b/src/streaming/models/FragmentModel.js @@ -205,9 +205,10 @@ function FragmentModel(config) { executedRequests.push(request); addSchedulingInfoMetrics(request, FRAGMENT_MODEL_EXECUTED); logger.debug('STREAM_COMPLETED'); - eventBus.trigger(events.STREAM_COMPLETED, { - request: request - }, request.mediaInfo.streamInfo.id, request.mediaType); + eventBus.trigger(events.STREAM_COMPLETED, + { request: request }, + { streamId: request.mediaInfo.streamInfo.id, mediaType: request.mediaType } + ); break; case FragmentRequest.ACTION_DOWNLOAD: addSchedulingInfoMetrics(request, FRAGMENT_MODEL_LOADING); @@ -220,7 +221,10 @@ function FragmentModel(config) { } function loadCurrentFragment(request) { - eventBus.trigger(events.FRAGMENT_LOADING_STARTED, { request: request }, streamInfo.id, type); + eventBus.trigger(events.FRAGMENT_LOADING_STARTED, + { request: request }, + { streamId: streamInfo.id, mediaType: type } + ); fragmentLoader.load(request); } @@ -286,29 +290,38 @@ function FragmentModel(config) { addSchedulingInfoMetrics(e.request, e.error ? FRAGMENT_MODEL_FAILED : FRAGMENT_MODEL_EXECUTED); - eventBus.trigger(events.FRAGMENT_LOADING_COMPLETED, { - request: e.request, - response: e.response, - error: e.error, - sender: this - }, streamInfo.id, type); + eventBus.trigger(events.FRAGMENT_LOADING_COMPLETED, + { + request: e.request, + response: e.response, + error: e.error, + sender: this + }, + { streamId: streamInfo.id, mediaType: type } + ); } function onLoadingInProgress(e) { if (e.sender !== fragmentLoader) return; - eventBus.trigger(events.FRAGMENT_LOADING_PROGRESS, { - request: e.request, - response: e.response, - error: e.error, - sender: this - }, streamInfo.id, type); + eventBus.trigger(events.FRAGMENT_LOADING_PROGRESS, + { + request: e.request, + response: e.response, + error: e.error, + sender: this + }, + { streamId: streamInfo.id, mediaType: type } + ); } function onLoadingAborted(e) { if (e.sender !== fragmentLoader) return; - eventBus.trigger(events.FRAGMENT_LOADING_ABANDONED, { request: e.request }, streamInfo.id, type); + eventBus.trigger(events.FRAGMENT_LOADING_ABANDONED, + { request: e.request }, + { streamId: streamInfo.id, mediaType: type } + ); } function resetInitialSettings() { diff --git a/src/streaming/text/NotFragmentedTextBufferController.js b/src/streaming/text/NotFragmentedTextBufferController.js index b88feea14e..716a55b8c9 100644 --- a/src/streaming/text/NotFragmentedTextBufferController.js +++ b/src/streaming/text/NotFragmentedTextBufferController.js @@ -153,9 +153,10 @@ function NotFragmentedTextBufferController(config) { isBufferingCompleted = false; // // Text data file is contained in initialization segment - eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, { - representationId: e.currentRepresentation.id - }, streamInfo.id, type); + eventBus.trigger(Events.INIT_FRAGMENT_NEEDED, + { representationId: e.currentRepresentation.id }, + { streamId: streamInfo.id, mediaType: type } + ); } function appendInitSegment(representationId) { @@ -171,9 +172,10 @@ function NotFragmentedTextBufferController(config) { isBufferingCompleted = true; - eventBus.trigger(Events.STREAM_COMPLETED, { - request: e.request - }, streamInfo.id, type); + eventBus.trigger(Events.STREAM_COMPLETED, + { request: e.request }, + { streamId: streamInfo.id, mediaType: type } + ); } function getRangeAt() { From e9023ecbbe3bea2ac27066316838089a58be845d Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Tue, 15 Sep 2020 17:33:57 +0200 Subject: [PATCH 13/22] code style --- src/core/Debug.js | 2 +- .../controllers/RepresentationController.js | 2 +- src/offline/OfflineDownload.js | 4 +- src/streaming/FragmentLoader.js | 9 ++- src/streaming/ManifestLoader.js | 76 ++++++++----------- src/streaming/ManifestUpdater.js | 2 +- src/streaming/Stream.js | 12 +-- src/streaming/controllers/EventController.js | 2 +- .../controllers/FragmentController.js | 2 +- src/streaming/controllers/GapController.js | 2 +- src/streaming/controllers/MediaController.js | 6 +- .../controllers/PlaybackController.js | 38 +++------- src/streaming/controllers/StreamController.js | 15 ++-- .../controllers/TimeSyncController.js | 6 +- src/streaming/controllers/XlinkController.js | 4 +- .../MetricsCollectionController.js | 4 +- .../metrics/handlers/DVBErrorsHandler.js | 4 +- src/streaming/models/ManifestModel.js | 2 +- src/streaming/models/MetricsModel.js | 6 +- .../controllers/ProtectionController.js | 12 +-- .../protection/models/ProtectionModel_01b.js | 14 ++-- .../models/ProtectionModel_21Jan2015.js | 28 +++---- src/streaming/text/TextTracks.js | 8 +- src/streaming/utils/BaseURLSelector.js | 14 ++-- src/streaming/utils/ErrorHandler.js | 2 +- src/streaming/utils/TTMLParser.js | 2 +- 26 files changed, 121 insertions(+), 157 deletions(-) diff --git a/src/core/Debug.js b/src/core/Debug.js index 33ae0eacf9..954955e766 100644 --- a/src/core/Debug.js +++ b/src/core/Debug.js @@ -169,7 +169,7 @@ function Debug(config) { } // send log event regardless of log level - eventBus.trigger(Events.LOG, {message: message, level: level}); + eventBus.trigger(Events.LOG, { message: message, level: level }); } instance = { diff --git a/src/dash/controllers/RepresentationController.js b/src/dash/controllers/RepresentationController.js index 9022a818cb..8e4e9257c6 100644 --- a/src/dash/controllers/RepresentationController.js +++ b/src/dash/controllers/RepresentationController.js @@ -223,7 +223,7 @@ function RepresentationController(config) { updateAvailabilityWindow(playbackController.getIsDynamic(), true); }; - eventBus.trigger(events.AST_IN_FUTURE, {delay: delay}); + eventBus.trigger(events.AST_IN_FUTURE, { delay: delay }); setTimeout(update, delay); } diff --git a/src/offline/OfflineDownload.js b/src/offline/OfflineDownload.js index 495460cf02..b9ea24103b 100644 --- a/src/offline/OfflineDownload.js +++ b/src/offline/OfflineDownload.js @@ -176,7 +176,7 @@ function OfflineDownload(config) { if (!e.error && manifestId !== null) { _status = OfflineConstants.OFFLINE_STATUS_STARTED; offlineStoreController.setDownloadingStatus(manifestId, _status).then(function () { - eventBus.trigger(events.OFFLINE_RECORD_STARTED, {id: manifestId, message: 'Downloading started for this stream !'}); + eventBus.trigger(events.OFFLINE_RECORD_STARTED, { id: manifestId, message: 'Downloading started for this stream !' }); }); } else { _status = OfflineConstants.OFFLINE_STATUS_ERROR; @@ -234,7 +234,7 @@ function OfflineDownload(config) { _status = OfflineConstants.OFFLINE_STATUS_FINISHED; offlineStoreController.setDownloadingStatus(manifestId, _status) .then(function () { - eventBus.trigger(events.OFFLINE_RECORD_FINISHED, {id: manifestId, message: 'Downloading has been successfully completed for this stream !'}); + eventBus.trigger(events.OFFLINE_RECORD_FINISHED, { id: manifestId, message: 'Downloading has been successfully completed for this stream !' }); resetDownload(); }); } else { diff --git a/src/streaming/FragmentLoader.js b/src/streaming/FragmentLoader.js index 35344cbea9..bc7d17a13d 100644 --- a/src/streaming/FragmentLoader.js +++ b/src/streaming/FragmentLoader.js @@ -63,8 +63,7 @@ function FragmentLoader(config) { function checkForExistence(request) { const report = function (success) { - eventBus.trigger( - events.CHECK_FOR_EXISTENCE_COMPLETED, { + eventBus.trigger(events.CHECK_FOR_EXISTENCE_COMPLETED, { request: request, exists: success } @@ -129,7 +128,11 @@ function FragmentLoader(config) { }, abort: function (request) { if (request) { - eventBus.trigger(events.LOADING_ABANDONED, {request: request, mediaType: request.mediaType, sender: instance}); + eventBus.trigger(events.LOADING_ABANDONED, { + mediaType: request.mediaType, + request: request, + sender: instance + }); } } }); diff --git a/src/streaming/ManifestLoader.js b/src/streaming/ManifestLoader.js index 8073c088e1..e8095eeb89 100644 --- a/src/streaming/ManifestLoader.js +++ b/src/streaming/ManifestLoader.js @@ -87,11 +87,7 @@ function ManifestLoader(config) { } function onXlinkReady(event) { - eventBus.trigger( - Events.INTERNAL_MANIFEST_LOADED, { - manifest: event.manifest - } - ); + eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, { manifest: event.manifest }); } function createParser(data) { @@ -147,15 +143,13 @@ function ManifestLoader(config) { } if (parser === null) { - eventBus.trigger( - Events.INTERNAL_MANIFEST_LOADED, { - manifest: null, - error: new DashJSError( - Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE, - Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}` - ) - } - ); + eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, { + manifest: null, + error: new DashJSError( + Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE, + Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}` + ) + }); return; } @@ -166,15 +160,13 @@ function ManifestLoader(config) { try { manifest = parser.parse(data); } catch (e) { - eventBus.trigger( - Events.INTERNAL_MANIFEST_LOADED, { - manifest: null, - error: new DashJSError( - Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE, - Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}` - ) - } - ); + eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, { + manifest: null, + error: new DashJSError( + Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE, + Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}` + ) + }); return; } @@ -197,33 +189,25 @@ function ManifestLoader(config) { manifest.loadedTime = new Date(); xlinkController.resolveManifestOnLoad(manifest); - eventBus.trigger( - Events.ORIGINAL_MANIFEST_LOADED, { - originalManifest: data - } - ); + eventBus.trigger(Events.ORIGINAL_MANIFEST_LOADED, { originalManifest: data }); } else { - eventBus.trigger( - Events.INTERNAL_MANIFEST_LOADED, { - manifest: null, - error: new DashJSError( - Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE, - Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}` - ) - } - ); - } - }, - error: function (request, statusText, errorText) { - eventBus.trigger( - Events.INTERNAL_MANIFEST_LOADED, { + eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, { manifest: null, error: new DashJSError( - Errors.MANIFEST_LOADER_LOADING_FAILURE_ERROR_CODE, - Errors.MANIFEST_LOADER_LOADING_FAILURE_ERROR_MESSAGE + `${url}, ${errorText}` + Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_CODE, + Errors.MANIFEST_LOADER_PARSING_FAILURE_ERROR_MESSAGE + `${url}` ) - } - ); + }); + } + }, + error: function (request, statusText, errorText) { + eventBus.trigger(Events.INTERNAL_MANIFEST_LOADED, { + manifest: null, + error: new DashJSError( + Errors.MANIFEST_LOADER_LOADING_FAILURE_ERROR_CODE, + Errors.MANIFEST_LOADER_LOADING_FAILURE_ERROR_MESSAGE + `${url}, ${errorText}` + ) + }); } }); } diff --git a/src/streaming/ManifestUpdater.js b/src/streaming/ManifestUpdater.js index 3cb23e4b6a..7f46dc08e6 100644 --- a/src/streaming/ManifestUpdater.js +++ b/src/streaming/ManifestUpdater.js @@ -164,7 +164,7 @@ function ManifestUpdater() { if (refreshDelay * 1000 > 0x7FFFFFFF) { refreshDelay = 0x7FFFFFFF / 1000; } - eventBus.trigger(Events.MANIFEST_UPDATED, {manifest: manifest}); + eventBus.trigger(Events.MANIFEST_UPDATED, { manifest: manifest }); logger.info('Manifest has been refreshed at ' + date + '[' + date.getTime() / 1000 + '] '); if (!isPaused) { diff --git a/src/streaming/Stream.js b/src/streaming/Stream.js index d22763a474..de2b85796e 100644 --- a/src/streaming/Stream.js +++ b/src/streaming/Stream.js @@ -119,9 +119,7 @@ function Stream(config) { function initialize() { registerEvents(); registerProtectionEvents(); - eventBus.trigger(Events.STREAM_UPDATED, { - streamInfo: streamInfo - }); + eventBus.trigger(Events.STREAM_UPDATED, { streamInfo: streamInfo }); } function registerEvents() { @@ -708,9 +706,7 @@ function Stream(config) { } logger.debug('onBufferingCompleted - trigger STREAM_BUFFERING_COMPLETED'); - eventBus.trigger(Events.STREAM_BUFFERING_COMPLETED, { - streamInfo: streamInfo - }); + eventBus.trigger(Events.STREAM_BUFFERING_COMPLETED, { streamInfo: streamInfo }); } function onDataUpdateCompleted(e) { @@ -759,9 +755,7 @@ function Stream(config) { isUpdating = true; streamInfo = updatedStreamInfo; - eventBus.trigger(Events.STREAM_UPDATED, { - streamInfo: streamInfo - }); + eventBus.trigger(Events.STREAM_UPDATED, { streamInfo: streamInfo }); if (eventController) { addInlineEvents(); diff --git a/src/streaming/controllers/EventController.js b/src/streaming/controllers/EventController.js index 6f9a3d6a58..d58cec396e 100644 --- a/src/streaming/controllers/EventController.js +++ b/src/streaming/controllers/EventController.js @@ -325,7 +325,7 @@ function EventController() { _sendCallbackRequest(event.messageData); } else { logger.debug(`Starting event ${eventId} at ${currentVideoTime}`); - eventBus.trigger(event.eventStream.schemeIdUri, {event: event}); + eventBus.trigger(event.eventStream.schemeIdUri, { event: event }); } delete events[eventId]; diff --git a/src/streaming/controllers/FragmentController.js b/src/streaming/controllers/FragmentController.js index a50a923b52..e7baba01a5 100644 --- a/src/streaming/controllers/FragmentController.js +++ b/src/streaming/controllers/FragmentController.js @@ -140,7 +140,7 @@ function FragmentController( config ) { if (e.error) { if (request.mediaType === Constants.AUDIO || request.mediaType === Constants.VIDEO || request.mediaType === Constants.FRAGMENTED_TEXT) { // add service location to blacklist controller - only for audio or video. text should not set errors - eventBus.trigger(Events.SERVICE_LOCATION_BLACKLIST_ADD, {entry: e.request.serviceLocation}); + eventBus.trigger(Events.SERVICE_LOCATION_BLACKLIST_ADD, { entry: e.request.serviceLocation }); } } diff --git a/src/streaming/controllers/GapController.js b/src/streaming/controllers/GapController.js index 381146979a..0ed3754936 100644 --- a/src/streaming/controllers/GapController.js +++ b/src/streaming/controllers/GapController.js @@ -217,7 +217,7 @@ function GapController() { if (seekToPosition > 0 && lastGapJumpPosition !== seekToPosition) { if (jumpToStreamEnd) { logger.warn(`Jumping to end of stream because of gap from ${currentTime} to ${seekToPosition}. Gap duration: ${seekToPosition - currentTime}`); - eventBus.trigger(Events.GAP_CAUSED_SEEK_TO_PERIOD_END, {seekTime: seekToPosition}); + eventBus.trigger(Events.GAP_CAUSED_SEEK_TO_PERIOD_END, { seekTime: seekToPosition }); } else { logger.warn(`Jumping gap from ${currentTime} to ${seekToPosition}. Gap duration: ${seekToPosition - currentTime}`); playbackController.seek(seekToPosition, true, true); diff --git a/src/streaming/controllers/MediaController.js b/src/streaming/controllers/MediaController.js index cf809b4298..0747e138b1 100644 --- a/src/streaming/controllers/MediaController.js +++ b/src/streaming/controllers/MediaController.js @@ -195,7 +195,11 @@ function MediaController() { tracks[id][type].current = track; if (tracks[id][type].current && !(noSettingsSave && type === Constants.FRAGMENTED_TEXT)) { - eventBus.trigger(Events.CURRENT_TRACK_CHANGED, {oldMediaInfo: current, newMediaInfo: track, switchMode: switchMode[type]}); + eventBus.trigger(Events.CURRENT_TRACK_CHANGED, { + oldMediaInfo: current, + newMediaInfo: track, + switchMode: switchMode[type] + }); } if (!noSettingsSave) { diff --git a/src/streaming/controllers/PlaybackController.js b/src/streaming/controllers/PlaybackController.js index a38b51cef6..420745e02e 100644 --- a/src/streaming/controllers/PlaybackController.js +++ b/src/streaming/controllers/PlaybackController.js @@ -140,9 +140,7 @@ function PlaybackController() { if (!isNaN(startTime) && startTime !== videoModel.getTime()) { // Trigger PLAYBACK_SEEKING event for controllers - eventBus.trigger(Events.PLAYBACK_SEEKING, { - seekTime: startTime - }); + eventBus.trigger(Events.PLAYBACK_SEEKING, { seekTime: startTime }); // Seek video model seek(startTime, false, true); } @@ -467,30 +465,22 @@ function PlaybackController() { logger.info('Native video element event: play'); updateCurrentTime(); startUpdatingWallclockTime(); - eventBus.trigger(Events.PLAYBACK_STARTED, { - startTime: getTime() - }); + eventBus.trigger(Events.PLAYBACK_STARTED, { startTime: getTime() }); } function onPlaybackWaiting() { logger.info('Native video element event: waiting'); - eventBus.trigger(Events.PLAYBACK_WAITING, { - playingTime: getTime() - }); + eventBus.trigger(Events.PLAYBACK_WAITING, { playingTime: getTime() }); } function onPlaybackPlaying() { logger.info('Native video element event: playing'); - eventBus.trigger(Events.PLAYBACK_PLAYING, { - playingTime: getTime() - }); + eventBus.trigger(Events.PLAYBACK_PLAYING, { playingTime: getTime() }); } function onPlaybackPaused() { logger.info('Native video element event: pause'); - eventBus.trigger(Events.PLAYBACK_PAUSED, { - ended: getEnded() - }); + eventBus.trigger(Events.PLAYBACK_PAUSED, { ended: getEnded() }); } function onPlaybackSeeking() { @@ -504,9 +494,7 @@ function PlaybackController() { logger.info('Seeking to: ' + seekTime); startUpdatingWallclockTime(); - eventBus.trigger(Events.PLAYBACK_SEEKING, { - seekTime: seekTime - }); + eventBus.trigger(Events.PLAYBACK_SEEKING, { seekTime: seekTime }); } function onPlaybackSeeked() { @@ -540,9 +528,7 @@ function PlaybackController() { function onPlaybackRateChanged() { const rate = getPlaybackRate(); logger.info('Native video element event: ratechange: ', rate); - eventBus.trigger(Events.PLAYBACK_RATE_CHANGED, { - playbackRate: rate - }); + eventBus.trigger(Events.PLAYBACK_RATE_CHANGED, { playbackRate: rate }); } function onPlaybackMetaDataLoaded() { @@ -556,7 +542,7 @@ function PlaybackController() { logger.info('Native video element event: ended'); pause(); stopUpdatingWallclockTime(); - eventBus.trigger(Events.PLAYBACK_ENDED, {'isLast': streamController.getActiveStreamInfo().isLast}); + eventBus.trigger(Events.PLAYBACK_ENDED, { 'isLast': streamController.getActiveStreamInfo().isLast }); } // Handle DASH PLAYBACK_ENDED event @@ -573,9 +559,7 @@ function PlaybackController() { function onPlaybackError(event) { const target = event.target || event.srcElement; - eventBus.trigger(Events.PLAYBACK_ERROR, { - error: target.error - }); + eventBus.trigger(Events.PLAYBACK_ERROR, { error: target.error }); } function onWallclockTime() { @@ -703,9 +687,7 @@ function PlaybackController() { } function onPlaybackStalled(e) { - eventBus.trigger(Events.PLAYBACK_STALLED, { - e: e - }); + eventBus.trigger(Events.PLAYBACK_STALLED, { e: e }); } function onStreamInitializing(e) { diff --git a/src/streaming/controllers/StreamController.js b/src/streaming/controllers/StreamController.js index 2fa0030d80..ba0e6ee7aa 100644 --- a/src/streaming/controllers/StreamController.js +++ b/src/streaming/controllers/StreamController.js @@ -232,7 +232,7 @@ function StreamController() { if (!playbackEndedTimerInterval) { playbackEndedTimerInterval = setInterval(function () { if (!isStreamSwitchingInProgress && playbackController.getTimeToStreamEnd() <= 0) { - eventBus.trigger(Events.PLAYBACK_ENDED, {'isLast': getActiveStreamInfo().isLast}); + eventBus.trigger(Events.PLAYBACK_ENDED, { 'isLast': getActiveStreamInfo().isLast }); } }, PLAYBACK_ENDED_TIMER_INTERVAL); } @@ -619,7 +619,10 @@ function StreamController() { if (!isNaN(seekTime)) { // If the streamswitch has been triggered by a seek command there is no need to seek again. Still we need to trigger the seeking event in order for the controllers to adjust the new time if (seekTime === playbackController.getTime()) { - eventBus.trigger(Events.SEEK_TARGET, {time: seekTime, streamId: activeStream.getId()}); + eventBus.trigger(Events.SEEK_TARGET, { + streamId: activeStream.getId(), + time: seekTime + }); } else { playbackController.seek(seekTime); } @@ -631,9 +634,7 @@ function StreamController() { } isStreamSwitchingInProgress = false; - eventBus.trigger(Events.PERIOD_SWITCH_COMPLETED, { - toStreamInfo: getActiveStreamInfo() - }); + eventBus.trigger(Events.PERIOD_SWITCH_COMPLETED, { toStreamInfo: getActiveStreamInfo() }); } function setMediaDuration(duration) { @@ -1098,9 +1099,7 @@ function StreamController() { protectionController = null; protectionData = null; if (manifestModel.getValue()) { - eventBus.trigger(Events.PROTECTION_DESTROYED, { - data: manifestModel.getValue().url - }); + eventBus.trigger(Events.PROTECTION_DESTROYED, { data: manifestModel.getValue().url }); } } diff --git a/src/streaming/controllers/TimeSyncController.js b/src/streaming/controllers/TimeSyncController.js index b3f45d76c9..6855ab204a 100644 --- a/src/streaming/controllers/TimeSyncController.js +++ b/src/streaming/controllers/TimeSyncController.js @@ -282,7 +282,11 @@ function TimeSyncController() { function completeTimeSyncSequence(failed, time, offset) { setIsSynchronizing(false); - eventBus.trigger(Events.TIME_SYNCHRONIZATION_COMPLETED, { time: time, offset: offset, error: failed ? new DashJSError(Errors.TIME_SYNC_FAILED_ERROR_CODE, Errors.TIME_SYNC_FAILED_ERROR_MESSAGE) : null }); + eventBus.trigger(Events.TIME_SYNCHRONIZATION_COMPLETED, { + time: time, + offset: offset, + error: failed ? new DashJSError(Errors.TIME_SYNC_FAILED_ERROR_CODE, Errors.TIME_SYNC_FAILED_ERROR_MESSAGE) : null + }); } function calculateTimeOffset(serverTime, deviceTime) { diff --git a/src/streaming/controllers/XlinkController.js b/src/streaming/controllers/XlinkController.js index 5f9610127a..0de9e3f7b2 100644 --- a/src/streaming/controllers/XlinkController.js +++ b/src/streaming/controllers/XlinkController.js @@ -166,7 +166,7 @@ function XlinkController(config) { mergeElementsBack(resolveObject); if (resolveObject.resolveType === RESOLVE_TYPE_ONACTUATE) { - eventBus.trigger(Events.XLINK_READY, {manifest: manifest}); + eventBus.trigger(Events.XLINK_READY, { manifest: manifest }); } if (resolveObject.resolveType === RESOLVE_TYPE_ONLOAD) { switch (resolveObject.type) { @@ -185,7 +185,7 @@ function XlinkController(config) { break; case DashConstants.ADAPTATION_SET: // TODO: Resolve SegmentList here - eventBus.trigger(Events.XLINK_READY, {manifest: manifest}); + eventBus.trigger(Events.XLINK_READY, { manifest: manifest }); break; } } diff --git a/src/streaming/metrics/controllers/MetricsCollectionController.js b/src/streaming/metrics/controllers/MetricsCollectionController.js index 477efeb280..c4d9a7b4a3 100644 --- a/src/streaming/metrics/controllers/MetricsCollectionController.js +++ b/src/streaming/metrics/controllers/MetricsCollectionController.js @@ -78,9 +78,7 @@ function MetricsCollectionController(config) { delete metricsControllers[c]; }); - eventBus.trigger( - MetricsReportingEvents.METRICS_INITIALISATION_COMPLETE - ); + eventBus.trigger(MetricsReportingEvents.METRICS_INITIALISATION_COMPLETE); } function resetMetricsControllers() { diff --git a/src/streaming/metrics/metrics/handlers/DVBErrorsHandler.js b/src/streaming/metrics/metrics/handlers/DVBErrorsHandler.js index aebb11e043..041c0e9fd2 100644 --- a/src/streaming/metrics/metrics/handlers/DVBErrorsHandler.js +++ b/src/streaming/metrics/metrics/handlers/DVBErrorsHandler.js @@ -50,9 +50,7 @@ function DVBErrorsHandler(config) { // Note: A Player becoming a reporting Player is itself // something which is recorded by the DVBErrors metric. - eventBus.trigger( - MetricsReportingEvents.BECAME_REPORTING_PLAYER - ); + eventBus.trigger(MetricsReportingEvents.BECAME_REPORTING_PLAYER); } function initialize(unused, rc) { diff --git a/src/streaming/models/ManifestModel.js b/src/streaming/models/ManifestModel.js index 200b3893ab..841d72694c 100644 --- a/src/streaming/models/ManifestModel.js +++ b/src/streaming/models/ManifestModel.js @@ -47,7 +47,7 @@ function ManifestModel() { function setValue(value) { manifest = value; if (value) { - eventBus.trigger(Events.MANIFEST_LOADED, {data: value}); + eventBus.trigger(Events.MANIFEST_LOADED, { data: value }); } } diff --git a/src/streaming/models/MetricsModel.js b/src/streaming/models/MetricsModel.js index 82a744b047..e5035722ec 100644 --- a/src/streaming/models/MetricsModel.js +++ b/src/streaming/models/MetricsModel.js @@ -65,17 +65,17 @@ function MetricsModel(config) { } function metricChanged(mediaType) { - eventBus.trigger(Events.METRIC_CHANGED, {mediaType: mediaType}); + eventBus.trigger(Events.METRIC_CHANGED, { mediaType: mediaType }); metricsChanged(); } function metricUpdated(mediaType, metricType, vo) { - eventBus.trigger(Events.METRIC_UPDATED, {mediaType: mediaType, metric: metricType, value: vo}); + eventBus.trigger(Events.METRIC_UPDATED, { mediaType: mediaType, metric: metricType, value: vo }); metricChanged(mediaType); } function metricAdded(mediaType, metricType, vo) { - eventBus.trigger(Events.METRIC_ADDED, {mediaType: mediaType, metric: metricType, value: vo}); + eventBus.trigger(Events.METRIC_ADDED, { mediaType: mediaType, metric: metricType, value: vo }); metricChanged(mediaType); } diff --git a/src/streaming/protection/controllers/ProtectionController.js b/src/streaming/protection/controllers/ProtectionController.js index e664f8ca1f..aaa9ba39f4 100644 --- a/src/streaming/protection/controllers/ProtectionController.js +++ b/src/streaming/protection/controllers/ProtectionController.js @@ -437,11 +437,11 @@ function ProtectionController(config) { eventBus.off(events.KEY_SYSTEM_ACCESS_COMPLETE, onKeySystemAccessComplete, self); if (event.error) { if (!fromManifest) { - eventBus.trigger(events.KEY_SYSTEM_SELECTED, {error: new DashJSError(ProtectionErrors.KEY_SYSTEM_ACCESS_DENIED_ERROR_CODE, ProtectionErrors.KEY_SYSTEM_ACCESS_DENIED_ERROR_MESSAGE + event.error)}); + eventBus.trigger(events.KEY_SYSTEM_SELECTED, { error: new DashJSError(ProtectionErrors.KEY_SYSTEM_ACCESS_DENIED_ERROR_CODE, ProtectionErrors.KEY_SYSTEM_ACCESS_DENIED_ERROR_MESSAGE + event.error) }); } } else { logger.info('DRM: KeySystem Access Granted'); - eventBus.trigger(events.KEY_SYSTEM_SELECTED, {data: event.data}); + eventBus.trigger(events.KEY_SYSTEM_SELECTED, { data: event.data }); const protData = getProtData(keySystem); if (protectionKeyController.isClearKey(keySystem)) { // For Clearkey: if parameters for generating init data was provided by the user, use them for generating @@ -504,7 +504,7 @@ function ProtectionController(config) { return; } keySystem = protectionModel.getKeySystem(); - eventBus.trigger(events.KEY_SYSTEM_SELECTED, {data: keySystemAccess}); + eventBus.trigger(events.KEY_SYSTEM_SELECTED, { data: keySystemAccess }); // Set server certificate from protData const protData = getProtData(keySystem); if (protData && protData.serverCertificate && protData.serverCertificate.length > 0) { @@ -552,12 +552,12 @@ function ProtectionController(config) { } function sendLicenseRequestCompleteEvent(data, error) { - eventBus.trigger(events.LICENSE_REQUEST_COMPLETE, {data: data, error: error}); + eventBus.trigger(events.LICENSE_REQUEST_COMPLETE, { data: data, error: error }); } function onKeyStatusChanged(e) { if (e.error) { - eventBus.trigger(events.KEY_STATUSES_CHANGED, {data: null, error: e.error}); + eventBus.trigger(events.KEY_STATUSES_CHANGED, { data: null, error: e.error }); } else { logger.debug('DRM: key status = ' + e.status); } @@ -568,7 +568,7 @@ function ProtectionController(config) { // Dispatch event to applications indicating we received a key message const keyMessage = e.data; - eventBus.trigger(events.KEY_MESSAGE, {data: keyMessage}); + eventBus.trigger(events.KEY_MESSAGE, { data: keyMessage }); const messageType = (keyMessage.messageType) ? keyMessage.messageType : 'license-request'; const message = keyMessage.message; const sessionToken = keyMessage.sessionToken; diff --git a/src/streaming/protection/models/ProtectionModel_01b.js b/src/streaming/protection/models/ProtectionModel_01b.js index 2a6e509bed..454ad6544e 100644 --- a/src/streaming/protection/models/ProtectionModel_01b.js +++ b/src/streaming/protection/models/ProtectionModel_01b.js @@ -166,7 +166,7 @@ function ProtectionModel_01b(config) { } } if (!found) { - eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, {error: 'Key system access denied! -- No valid audio/video content configurations detected!'}); + eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { error: 'Key system access denied! -- No valid audio/video content configurations detected!' }); } } @@ -258,7 +258,7 @@ function ProtectionModel_01b(config) { try { videoElement[api.cancelKeyRequest](keySystem.systemString, sessionToken.sessionID); } catch (error) { - eventBus.trigger(events.KEY_SESSION_CLOSED, {data: null, error: 'Error closing session (' + sessionToken.sessionID + ') ' + error.message}); + eventBus.trigger(events.KEY_SESSION_CLOSED, { data: null, error: 'Error closing session (' + sessionToken.sessionID + ') ' + error.message }); } } @@ -273,7 +273,7 @@ function ProtectionModel_01b(config) { switch (event.type) { case api.needkey: let initData = ArrayBuffer.isView(event.initData) ? event.initData.buffer : event.initData; - eventBus.trigger(events.NEED_KEY, {key: new NeedKey(initData, 'cenc')}); + eventBus.trigger(events.NEED_KEY, { key: new NeedKey(initData, 'cenc') }); break; case api.keyerror: @@ -313,7 +313,7 @@ function ProtectionModel_01b(config) { } msg += ' System Code = ' + event.systemCode; // TODO: Build error string based on key error - eventBus.trigger(events.KEY_ERROR, {data: new DashJSError(code, msg, sessionToken)}); + eventBus.trigger(events.KEY_ERROR, { data: new DashJSError(code, msg, sessionToken) }); } else { logger.error('No session token found for key error'); } @@ -327,7 +327,7 @@ function ProtectionModel_01b(config) { if (sessionToken) { logger.debug('DRM: Key added.'); - eventBus.trigger(events.KEY_ADDED, {data: sessionToken});//TODO not sure anything is using sessionToken? why there? + eventBus.trigger(events.KEY_ADDED, { data: sessionToken });//TODO not sure anything is using sessionToken? why there? } else { logger.debug('No session token found for key added'); } @@ -350,7 +350,7 @@ function ProtectionModel_01b(config) { sessions.push(sessionToken); sessionToken.sessionID = event.sessionId; - eventBus.trigger(events.KEY_SESSION_CREATED, {data: sessionToken}); + eventBus.trigger(events.KEY_SESSION_CREATED, { data: sessionToken }); } } else if (pendingSessions.length > 0) { // SessionIDs not supported sessionToken = pendingSessions.shift(); @@ -368,7 +368,7 @@ function ProtectionModel_01b(config) { // addKey method, so we always save it to the token since there is no // way to tell which key system is in use sessionToken.keyMessage = message; - eventBus.trigger(events.INTERNAL_KEY_MESSAGE, {data: new KeyMessage(sessionToken, message, event.defaultURL)}); + eventBus.trigger(events.INTERNAL_KEY_MESSAGE, { data: new KeyMessage(sessionToken, message, event.defaultURL) }); } else { logger.warn('No session token found for key message'); diff --git a/src/streaming/protection/models/ProtectionModel_21Jan2015.js b/src/streaming/protection/models/ProtectionModel_21Jan2015.js index 49fab2fb75..ddcc0b9b31 100644 --- a/src/streaming/protection/models/ProtectionModel_21Jan2015.js +++ b/src/streaming/protection/models/ProtectionModel_21Jan2015.js @@ -155,7 +155,7 @@ function ProtectionModel_21Jan2015(config) { } }).catch(function () { - eventBus.trigger(events.INTERNAL_KEY_SYSTEM_SELECTED, {error: 'Error selecting keys system (' + keySystemAccess.keySystem.systemString + ')! Could not create MediaKeys -- TODO'}); + eventBus.trigger(events.INTERNAL_KEY_SYSTEM_SELECTED, { error: 'Error selecting keys system (' + keySystemAccess.keySystem.systemString + ')! Could not create MediaKeys -- TODO' }); }); } @@ -190,7 +190,7 @@ function ProtectionModel_21Jan2015(config) { logger.info('DRM: License server certificate successfully updated.'); eventBus.trigger(events.SERVER_CERTIFICATE_UPDATED); }).catch(function (error) { - eventBus.trigger(events.SERVER_CERTIFICATE_UPDATED, {error: new DashJSError(ProtectionErrors.SERVER_CERTIFICATE_UPDATED_ERROR_CODE, ProtectionErrors.SERVER_CERTIFICATE_UPDATED_ERROR_MESSAGE + error.name)}); + eventBus.trigger(events.SERVER_CERTIFICATE_UPDATED, { error: new DashJSError(ProtectionErrors.SERVER_CERTIFICATE_UPDATED_ERROR_CODE, ProtectionErrors.SERVER_CERTIFICATE_UPDATED_ERROR_MESSAGE + error.name) }); }); } @@ -208,7 +208,7 @@ function ProtectionModel_21Jan2015(config) { const dataType = ks.systemString === ProtectionConstants.CLEARKEY_KEYSTEM_STRING && (initData || (protData && protData.clearkeys)) ? 'keyids' : 'cenc'; session.generateRequest(dataType, initData).then(function () { logger.debug('DRM: Session created. SessionID = ' + sessionToken.getSessionID()); - eventBus.trigger(events.KEY_SESSION_CREATED, {data: sessionToken}); + eventBus.trigger(events.KEY_SESSION_CREATED, { data: sessionToken }); }).catch(function (error) { // TODO: Better error string removeSession(sessionToken); @@ -227,7 +227,7 @@ function ProtectionModel_21Jan2015(config) { message = message.toJWK(); } session.update(message).catch(function (error) { - eventBus.trigger(events.KEY_ERROR, {data: new DashJSError(ProtectionErrors.MEDIA_KEYERR_CODE, 'Error sending update() message! ' + error.name, sessionToken)}); + eventBus.trigger(events.KEY_ERROR, { data: new DashJSError(ProtectionErrors.MEDIA_KEYERR_CODE, 'Error sending update() message! ' + error.name, sessionToken) }); }); } @@ -251,7 +251,7 @@ function ProtectionModel_21Jan2015(config) { session.load(sessionID).then(function (success) { if (success) { logger.debug('DRM: Session loaded. SessionID = ' + sessionToken.getSessionID()); - eventBus.trigger(events.KEY_SESSION_CREATED, {data: sessionToken}); + eventBus.trigger(events.KEY_SESSION_CREATED, { data: sessionToken }); } else { removeSession(sessionToken); eventBus.trigger(events.KEY_SESSION_CREATED, { @@ -273,7 +273,7 @@ function ProtectionModel_21Jan2015(config) { session.remove().then(function () { logger.debug('DRM: Session removed. SessionID = ' + sessionToken.getSessionID()); - eventBus.trigger(events.KEY_SESSION_REMOVED, {data: sessionToken.getSessionID()}); + eventBus.trigger(events.KEY_SESSION_REMOVED, { data: sessionToken.getSessionID() }); }, function (error) { eventBus.trigger(events.KEY_SESSION_REMOVED, { data: null, @@ -298,7 +298,7 @@ function ProtectionModel_21Jan2015(config) { if (navigator.requestMediaKeySystemAccess === undefined || typeof navigator.requestMediaKeySystemAccess !== 'function') { - eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, {error: 'Insecure origins are not allowed'}); + eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { error: 'Insecure origins are not allowed' }); return; } @@ -318,13 +318,13 @@ function ProtectionModel_21Jan2015(config) { mediaKeySystemAccess.getConfiguration() : null; const keySystemAccess = new KeySystemAccess(keySystem, configuration); keySystemAccess.mksa = mediaKeySystemAccess; - eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, {data: keySystemAccess}); + eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { data: keySystemAccess }); }).catch(function (error) { if (++i < ksConfigurations.length) { requestKeySystemAccessInternal(ksConfigurations, i); } else { - eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, {error: 'Key system access denied! ' + error.message}); + eventBus.trigger(events.KEY_SYSTEM_ACCESS_COMPLETE, { error: 'Key system access denied! ' + error.message }); } }); })(idx); @@ -351,7 +351,7 @@ function ProtectionModel_21Jan2015(config) { case 'encrypted': if (event.initData) { let initData = ArrayBuffer.isView(event.initData) ? event.initData.buffer : event.initData; - eventBus.trigger(events.NEED_KEY, {key: new NeedKey(initData, event.initDataType)}); + eventBus.trigger(events.NEED_KEY, { key: new NeedKey(initData, event.initDataType) }); } break; } @@ -409,12 +409,12 @@ function ProtectionModel_21Jan2015(config) { handleEvent: function (event) { switch (event.type) { case 'keystatuseschange': - eventBus.trigger(events.KEY_STATUSES_CHANGED, {data: this}); + eventBus.trigger(events.KEY_STATUSES_CHANGED, { data: this }); event.target.keyStatuses.forEach(function () { let keyStatus = parseKeyStatus(arguments); switch (keyStatus.status) { case 'expired': - eventBus.trigger(events.INTERNAL_KEY_STATUS_CHANGED, {error: new DashJSError(ProtectionErrors.KEY_STATUS_CHANGED_EXPIRED_ERROR_CODE, ProtectionErrors.KEY_STATUS_CHANGED_EXPIRED_ERROR_MESSAGE)}); + eventBus.trigger(events.INTERNAL_KEY_STATUS_CHANGED, { error: new DashJSError(ProtectionErrors.KEY_STATUS_CHANGED_EXPIRED_ERROR_CODE, ProtectionErrors.KEY_STATUS_CHANGED_EXPIRED_ERROR_MESSAGE) }); break; default: eventBus.trigger(events.INTERNAL_KEY_STATUS_CHANGED, keyStatus); @@ -425,7 +425,7 @@ function ProtectionModel_21Jan2015(config) { case 'message': let message = ArrayBuffer.isView(event.message) ? event.message.buffer : event.message; - eventBus.trigger(events.INTERNAL_KEY_MESSAGE, {data: new KeyMessage(this, message, undefined, event.messageType)}); + eventBus.trigger(events.INTERNAL_KEY_MESSAGE, { data: new KeyMessage(this, message, undefined, event.messageType) }); break; } }, @@ -466,7 +466,7 @@ function ProtectionModel_21Jan2015(config) { session.closed.then(function () { removeSession(token); logger.debug('DRM: Session closed. SessionID = ' + token.getSessionID()); - eventBus.trigger(events.KEY_SESSION_CLOSED, {data: token.getSessionID()}); + eventBus.trigger(events.KEY_SESSION_CLOSED, { data: token.getSessionID() }); }); // Add to our session list diff --git a/src/streaming/text/TextTracks.js b/src/streaming/text/TextTracks.js index 85fc6a572f..a9814f9bdd 100644 --- a/src/streaming/text/TextTracks.js +++ b/src/streaming/text/TextTracks.js @@ -270,7 +270,7 @@ function TextTracks() { containerStyle.width = actualVideoWidth + 'px'; containerStyle.height = actualVideoHeight + 'px'; containerStyle.zIndex = (fullscreenAttribute && document[fullscreenAttribute]) || displayCCOnTop ? topZIndex : null; - eventBus.trigger(Events.CAPTION_CONTAINER_RESIZE, {}); + eventBus.trigger(Events.CAPTION_CONTAINER_RESIZE); } } @@ -391,7 +391,7 @@ function TextTracks() { //TODO add ErrorHandler management }, previousISDState, true /*enableRollUp*/); finalCue.id = cue.cueID; - eventBus.trigger(Events.CAPTION_RENDERED, {captionDiv: finalCue, currentTrackIdx}); + eventBus.trigger(Events.CAPTION_RENDERED, { captionDiv: finalCue, currentTrackIdx }); } } @@ -444,7 +444,7 @@ function TextTracks() { } else { captionContainer.appendChild(this.cueHTMLElement); scaleCue.call(self, this); - eventBus.trigger(Events.CAPTION_RENDERED, {captionDiv: this.cueHTMLElement, currentTrackIdx}); + eventBus.trigger(Events.CAPTION_RENDERED, { captionDiv: this.cueHTMLElement, currentTrackIdx }); } } }; @@ -480,7 +480,7 @@ function TextTracks() { } cue.onenter = function () { if (track.mode === Constants.TEXT_SHOWING) { - eventBus.trigger(Events.CAPTION_RENDERED, {currentTrackIdx}); + eventBus.trigger(Events.CAPTION_RENDERED, { currentTrackIdx }); } }; } diff --git a/src/streaming/utils/BaseURLSelector.js b/src/streaming/utils/BaseURLSelector.js index e5c984260f..f1f934630b 100644 --- a/src/streaming/utils/BaseURLSelector.js +++ b/src/streaming/utils/BaseURLSelector.js @@ -95,14 +95,12 @@ function BaseURLSelector() { let selectedBaseUrl = selector.select(baseUrls); if (!selectedBaseUrl) { - eventBus.trigger( - Events.URL_RESOLUTION_FAILED, { - error: new DashJSError( - Errors.URL_RESOLUTION_FAILED_GENERIC_ERROR_CODE, - Errors.URL_RESOLUTION_FAILED_GENERIC_ERROR_MESSAGE - ) - } - ); + eventBus.trigger(Events.URL_RESOLUTION_FAILED, { + error: new DashJSError( + Errors.URL_RESOLUTION_FAILED_GENERIC_ERROR_CODE, + Errors.URL_RESOLUTION_FAILED_GENERIC_ERROR_MESSAGE + ) + }); if (selector === basicSelector) { reset(); } diff --git a/src/streaming/utils/ErrorHandler.js b/src/streaming/utils/ErrorHandler.js index e020451757..f93aae833c 100644 --- a/src/streaming/utils/ErrorHandler.js +++ b/src/streaming/utils/ErrorHandler.js @@ -47,7 +47,7 @@ function ErrorHandler() { * @memberof module:ErrorHandler */ function error(err) { - eventBus.trigger(Events.ERROR, {error: err}); + eventBus.trigger(Events.ERROR, { error: err }); } instance = { error: error diff --git a/src/streaming/utils/TTMLParser.js b/src/streaming/utils/TTMLParser.js index 8a6145a70b..ca6ab58a5b 100644 --- a/src/streaming/utils/TTMLParser.js +++ b/src/streaming/utils/TTMLParser.js @@ -120,7 +120,7 @@ function TTMLParser() { errorMsg = msg; }, metadataHandler); - eventBus.trigger(Events.TTML_PARSED, {ttmlString: content.data, ttmlDoc: imsc1doc}); + eventBus.trigger(Events.TTML_PARSED, { ttmlString: content.data, ttmlDoc: imsc1doc }); const mediaTimeEvents = imsc1doc.getMediaTimeEvents(); From b246c89383e2aff4b17818f10d026eeb2e6c496d Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Tue, 3 Nov 2020 15:05:30 +0100 Subject: [PATCH 14/22] run functional tests --- .circleci/config.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 12eeff075e..e926117fd7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -93,6 +93,11 @@ workflows: commit-workflow: jobs: - build + - functional-tests: + filters: + branches: + only: pull/3372 + scheduled-workflow: triggers: - schedule: From 586bea59e2a96a11bdf79b4ce45968a96516871a Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Tue, 3 Nov 2020 15:12:46 +0100 Subject: [PATCH 15/22] run functional tests --- test/functional/config/applications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/config/applications.js b/test/functional/config/applications.js index 12ec48b82e..57583315ac 100644 --- a/test/functional/config/applications.js +++ b/test/functional/config/applications.js @@ -1,4 +1,4 @@ define({ local:'http://localhost:3000/samples/functional-tests/index.html', - remote:'reference.dashif.org/dash.js/nightly/samples/functional-tests/index.html', + remote:'orange-opensource.github.io/dash.js/pr3372/samples/functional-tests/index.html', }); From e6ddd348a642942d008a7a845c6a1e75e7836c4f Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Tue, 3 Nov 2020 16:44:48 +0100 Subject: [PATCH 16/22] run functional tests --- test/functional/config/applications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/config/applications.js b/test/functional/config/applications.js index 57583315ac..b0658e8612 100644 --- a/test/functional/config/applications.js +++ b/test/functional/config/applications.js @@ -1,4 +1,4 @@ define({ local:'http://localhost:3000/samples/functional-tests/index.html', - remote:'orange-opensource.github.io/dash.js/pr3372/samples/functional-tests/index.html', + remote:'reference.dashif.org/dash.js/pull/3372/samples/functional-tests/index.html', }); From a8399dfd209967e3f92980676109344e2134e0c0 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 4 Nov 2020 08:47:43 +0100 Subject: [PATCH 17/22] Revert "run functional tests" This reverts commit e6ddd348a642942d008a7a845c6a1e75e7836c4f. --- test/functional/config/applications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/config/applications.js b/test/functional/config/applications.js index b0658e8612..57583315ac 100644 --- a/test/functional/config/applications.js +++ b/test/functional/config/applications.js @@ -1,4 +1,4 @@ define({ local:'http://localhost:3000/samples/functional-tests/index.html', - remote:'reference.dashif.org/dash.js/pull/3372/samples/functional-tests/index.html', + remote:'orange-opensource.github.io/dash.js/pr3372/samples/functional-tests/index.html', }); From d998748b66efdbbe39f1f21c98ca922ebd0bdaca Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 4 Nov 2020 08:47:50 +0100 Subject: [PATCH 18/22] Revert "run functional tests" This reverts commit 586bea59e2a96a11bdf79b4ce45968a96516871a. --- test/functional/config/applications.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/functional/config/applications.js b/test/functional/config/applications.js index 57583315ac..12ec48b82e 100644 --- a/test/functional/config/applications.js +++ b/test/functional/config/applications.js @@ -1,4 +1,4 @@ define({ local:'http://localhost:3000/samples/functional-tests/index.html', - remote:'orange-opensource.github.io/dash.js/pr3372/samples/functional-tests/index.html', + remote:'reference.dashif.org/dash.js/nightly/samples/functional-tests/index.html', }); From d0e5625c3085983d7d8450e88eff5ddcc63178cb Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 4 Nov 2020 08:47:58 +0100 Subject: [PATCH 19/22] Revert "run functional tests" This reverts commit b246c89383e2aff4b17818f10d026eeb2e6c496d. --- .circleci/config.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e926117fd7..12eeff075e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -93,11 +93,6 @@ workflows: commit-workflow: jobs: - build - - functional-tests: - filters: - branches: - only: pull/3372 - scheduled-workflow: triggers: - schedule: From ac4d1ebfda9e566301e9a9c18b0974e8960b6358 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 4 Nov 2020 10:20:27 +0100 Subject: [PATCH 20/22] Complete events trigger refactoring --- src/streaming/controllers/BufferController.js | 2 +- src/streaming/controllers/StreamController.js | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/streaming/controllers/BufferController.js b/src/streaming/controllers/BufferController.js index ec1d2cc0b4..a8a08408f5 100644 --- a/src/streaming/controllers/BufferController.js +++ b/src/streaming/controllers/BufferController.js @@ -303,7 +303,7 @@ function BufferController(config) { // (and previous buffered data removed) then seek stream to current time const currentTime = playbackController.getTime(); logger.debug('AppendToBuffer seek target should be ' + currentTime); - triggerEvent(Events.SEEK_TARGET, {time: currentTime, mediaType: type, streamId: streamInfo.id}); + triggerEvent(Events.SEEK_TARGET, {time: currentTime}); } if (appendedBytesInfo) { diff --git a/src/streaming/controllers/StreamController.js b/src/streaming/controllers/StreamController.js index ba0e6ee7aa..7f7a235d12 100644 --- a/src/streaming/controllers/StreamController.js +++ b/src/streaming/controllers/StreamController.js @@ -619,10 +619,7 @@ function StreamController() { if (!isNaN(seekTime)) { // If the streamswitch has been triggered by a seek command there is no need to seek again. Still we need to trigger the seeking event in order for the controllers to adjust the new time if (seekTime === playbackController.getTime()) { - eventBus.trigger(Events.SEEK_TARGET, { - streamId: activeStream.getId(), - time: seekTime - }); + eventBus.trigger(Events.SEEK_TARGET, {time: seekTime}, {streamId: activeStream.getId()}); } else { playbackController.seek(seekTime); } From 15ab81958639b9308fe659ae80ce63cd3fdd30ec Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 4 Nov 2020 10:53:05 +0100 Subject: [PATCH 21/22] NotFragmentedTextBufferController: add missing getStreamId() function --- src/streaming/text/NotFragmentedTextBufferController.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/streaming/text/NotFragmentedTextBufferController.js b/src/streaming/text/NotFragmentedTextBufferController.js index 716a55b8c9..0e6856f80a 100644 --- a/src/streaming/text/NotFragmentedTextBufferController.js +++ b/src/streaming/text/NotFragmentedTextBufferController.js @@ -102,6 +102,10 @@ function NotFragmentedTextBufferController(config) { } } + function getStreamId() { + return streamInfo.id; + } + function getType() { return type; } @@ -192,6 +196,7 @@ function NotFragmentedTextBufferController(config) { getBufferControllerType: getBufferControllerType, initialize: initialize, createBuffer: createBuffer, + getStreamId: getStreamId, getType: getType, getBuffer: getBuffer, getBufferLevel: getBufferLevel, From 8bf60e6c378a88d73ed1bc050acda17a74458a3c Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 4 Nov 2020 11:09:55 +0100 Subject: [PATCH 22/22] fix unit tests --- test/unit/streaming.text.TextBufferController.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/unit/streaming.text.TextBufferController.js b/test/unit/streaming.text.TextBufferController.js index 9b2b2c4c89..d1ad3b6e61 100644 --- a/test/unit/streaming.text.TextBufferController.js +++ b/test/unit/streaming.text.TextBufferController.js @@ -5,6 +5,10 @@ const expect = chai.expect; const context = {}; +const streamInfo = { + id: 'streamId' +}; + describe('TextBufferController', function () { let textBufferController; @@ -13,6 +17,7 @@ describe('TextBufferController', function () { textBufferController = TextBufferController(context).create({ + streamInfo: streamInfo, type: 'fragmentedText' }); @@ -22,6 +27,7 @@ describe('TextBufferController', function () { it('should create a buffer of type "NotFragmentedTextBufferController" if type is not "fragmentedText"', function () { textBufferController = TextBufferController(context).create({ + streamInfo: streamInfo, type: 'other' });