From 80e14220508451080178a98613d9ed821649471c Mon Sep 17 00:00:00 2001 From: Jeff Cunat Date: Mon, 15 Jun 2020 17:28:07 +0200 Subject: [PATCH 1/9] use text settings stored in DomStorage if no other settings set --- src/streaming/Stream.js | 9 +--- src/streaming/controllers/MediaController.js | 56 +++++++++++--------- src/streaming/text/TextController.js | 32 ++++++++--- test/unit/mocks/MediaControllerMock.js | 2 + 4 files changed, 62 insertions(+), 37 deletions(-) diff --git a/src/streaming/Stream.js b/src/streaming/Stream.js index 3769421309..2a120837f4 100644 --- a/src/streaming/Stream.js +++ b/src/streaming/Stream.js @@ -474,14 +474,9 @@ function Stream(config) { return; } - if (type !== Constants.FRAGMENTED_TEXT || (type === Constants.FRAGMENTED_TEXT && textController.getTextDefaultEnabled())) { - mediaController.checkInitialMediaSettingsForType(type, streamInfo); - initialMediaInfo = mediaController.getCurrentTrackFor(type, streamInfo); - } - if (type === Constants.FRAGMENTED_TEXT && !textController.getTextDefaultEnabled()) { - initialMediaInfo = mediaController.getTracksFor(type, streamInfo)[0]; - } + mediaController.checkInitialMediaSettingsForType(type, streamInfo); + initialMediaInfo = mediaController.getCurrentTrackFor(type, streamInfo); eventBus.trigger(Events.STREAM_INITIALIZING, { streamInfo: streamInfo, diff --git a/src/streaming/controllers/MediaController.js b/src/streaming/controllers/MediaController.js index 53eaa9e540..a9b977dca8 100644 --- a/src/streaming/controllers/MediaController.js +++ b/src/streaming/controllers/MediaController.js @@ -78,12 +78,6 @@ function MediaController() { const tracksForType = getTracksFor(type, streamInfo); const tracks = []; - if (type === Constants.FRAGMENTED_TEXT) { - // Choose the first track - setTrack(tracksForType[0]); - return; - } - if (!settings) { settings = domStorage.getSavedMediaSettings(type); setInitialSettings(type, settings); @@ -100,10 +94,10 @@ function MediaController() { } if (tracks.length === 0) { - setTrack(selectInitialTrack(tracksForType)); + setTrack(type === Constants.FRAGMENTED_TEXT ? tracksForType[0] : selectInitialTrack(tracksForType), true); } else { if (tracks.length > 1) { - setTrack(selectInitialTrack(tracks)); + setTrack(type === Constants.FRAGMENTED_TEXT ? tracks[0] : selectInitialTrack(tracks)); } else { setTrack(tracks[0]); } @@ -185,9 +179,10 @@ function MediaController() { /** * @param {MediaInfo} track + * @param {boolean} noSettingsSave specify if settings must be not be saved * @memberof MediaController# */ - function setTrack(track) { + function setTrack(track, noSettingsSave) { if (!track || !track.streamInfo) return; const type = track.type; @@ -199,28 +194,31 @@ function MediaController() { tracks[id][type].current = track; - if (tracks[id][type].current) { + if (tracks[id][type].current && !(noSettingsSave && type === Constants.FRAGMENTED_TEXT)) { eventBus.trigger(Events.CURRENT_TRACK_CHANGED, {oldMediaInfo: current, newMediaInfo: track, switchMode: switchMode[type]}); } - let settings = extractSettings(track); + if (!noSettingsSave) { - if (!settings || !tracks[id][type].storeLastSettings) return; + let settings = extractSettings(track); - if (settings.roles) { - settings.role = settings.roles[0]; - delete settings.roles; - } + if (!settings || !tracks[id][type].storeLastSettings) return; - if (settings.accessibility) { - settings.accessibility = settings.accessibility[0]; - } + if (settings.roles) { + settings.role = settings.roles[0]; + delete settings.roles; + } - if (settings.audioChannelConfiguration) { - settings.audioChannelConfiguration = settings.audioChannelConfiguration[0]; - } + if (settings.accessibility) { + settings.accessibility = settings.accessibility[0]; + } - domStorage.setSavedMediaSettings(type, settings); + if (settings.audioChannelConfiguration) { + settings.audioChannelConfiguration = settings.audioChannelConfiguration[0]; + } + + domStorage.setSavedMediaSettings(type, settings); + } } /** @@ -245,6 +243,13 @@ function MediaController() { return initialSettings[type]; } + /** + * @memberof MediaController# + */ + function saveTextSettingsDisabled() { + domStorage.setSavedMediaSettings(Constants.FRAGMENTED_TEXT, null); + } + /** * @param {string} type * @param {string} mode @@ -384,13 +389,15 @@ function MediaController() { function resetInitialSettings() { initialSettings = { audio: null, - video: null + video: null, + fragmentedText: null }; } function selectInitialTrack(tracks) { let mode = getSelectionModeForInitialTrack(); let tmpArr = []; + const getTracksWithHighestBitrate = function (trackArr) { let max = 0; let result = []; @@ -497,6 +504,7 @@ function MediaController() { isMultiTrackSupportedByType: isMultiTrackSupportedByType, isTracksEqual: isTracksEqual, matchSettings: matchSettings, + saveTextSettingsDisabled: saveTextSettingsDisabled, setConfig: setConfig, reset: reset }; diff --git a/src/streaming/text/TextController.js b/src/streaming/text/TextController.js index a894b00811..5570f48d34 100644 --- a/src/streaming/text/TextController.js +++ b/src/streaming/text/TextController.js @@ -65,9 +65,8 @@ function TextController() { function setup() { - defaultSettings = {}; + defaultSettings = null; lastEnabledIndex = -1; - textDefaultEnabled = false; forceTextStreaming = false; textTracksAdded = false; disableTextBeforeTextTracksAdded = false; @@ -79,6 +78,7 @@ function TextController() { textTracks.initialize(); eventBus.on(Events.TEXT_TRACKS_QUEUE_INITIALIZED, onTextTracksAdded, instance); + eventBus.on(Events.CURRENT_TRACK_CHANGED, onSetSettings, instance); /* * register those event callbacks in order to detect switch of periods and set @@ -174,6 +174,9 @@ function TextController() { function setTextDefaultLanguage(lang) { checkParameterType(lang, 'string'); + if (!defaultSettings) { + defaultSettings = {}; + } defaultSettings.lang = lang; } @@ -182,7 +185,7 @@ function TextController() { } function getTextDefaultLanguage() { - return defaultSettings.lang || ''; + return defaultSettings && defaultSettings.lang || ''; } function onTextTracksAdded(e) { @@ -200,8 +203,8 @@ function TextController() { }); } - if (!textDefaultEnabled || disableTextBeforeTextTracksAdded) { - // disable text at startup + if (textDefaultEnabled === false || ( textDefaultEnabled === undefined && !defaultSettings ) || disableTextBeforeTextTracksAdded) { + // disable text at startup if explicitely configured with setTextDefaultEnanled(false) or if there is no defaultSettings (configuration or from domStorage) this.setTextTrack(-1); } @@ -214,6 +217,19 @@ function TextController() { textTracksAdded = true; } + function onSetSettings(event) { + if (!defaultSettings && event && event.newMediaInfo) { + let mediaInfo = event.newMediaInfo; + if (mediaInfo.type === Constants.FRAGMENTED_TEXT) { + defaultSettings = { + lang: mediaInfo.lang, + role: mediaInfo.roles[0], + accessibility: mediaInfo.accessibility[0] + }; + } + } + } + function setTextDefaultEnabled(enable) { checkParameterType(enable,'boolean'); textDefaultEnabled = enable; @@ -227,7 +243,7 @@ function TextController() { } function getTextDefaultEnabled() { - return textDefaultEnabled; + return textDefaultEnabled === undefined ? false : textDefaultEnabled; } function enableText(enable) { @@ -280,6 +296,10 @@ function TextController() { allTracksAreDisabled = idx === -1 ? true : false; + if (allTracksAreDisabled) { + mediaController.saveTextSettingsDisabled(); + } + let oldTrackIdx = textTracks.getCurrentTrackIdx(); if (oldTrackIdx !== idx) { textTracks.setModeForTrackIdx(oldTrackIdx, Constants.TEXT_HIDDEN); diff --git a/test/unit/mocks/MediaControllerMock.js b/test/unit/mocks/MediaControllerMock.js index 9cc46d793c..f0aa5a97e1 100644 --- a/test/unit/mocks/MediaControllerMock.js +++ b/test/unit/mocks/MediaControllerMock.js @@ -113,6 +113,8 @@ class MediaControllerMock { setConfig() {} + saveTextSettingsDisabled() {} + reset() { this.setup(); } From 8efe3b6488846652319ad999478352305692fb0c Mon Sep 17 00:00:00 2001 From: Jeff Cunat Date: Tue, 16 Jun 2020 09:00:13 +0200 Subject: [PATCH 2/9] modify multi captions test to ease multiple configuration (default, domStorage, initial settings...) --- samples/captioning/multi-track-captions.html | 97 +++++++++++++++++--- src/streaming/text/TextController.js | 1 + 2 files changed, 85 insertions(+), 13 deletions(-) diff --git a/samples/captioning/multi-track-captions.html b/samples/captioning/multi-track-captions.html index ce33bb9412..4efbb6b215 100644 --- a/samples/captioning/multi-track-captions.html +++ b/samples/captioning/multi-track-captions.html @@ -19,22 +19,61 @@ controlbar, player; - function startVideo() { - var url = FRAGMENTED_CAPTION_URL, - TTMLRenderingDiv; - + function init() { + var TTMLRenderingDiv = document.querySelector("#ttml-rendering-div"); videoElement = document.querySelector(".videoContainer video"); - TTMLRenderingDiv = document.querySelector("#ttml-rendering-div"); - player = dashjs.MediaPlayer().create(); - player.initialize(videoElement, url, true); - player.setTextDefaultEnabled(true); - player.setInitialMediaSettingsFor('fragmentedText', { - lang: 'swe' - }); + player.initialize(videoElement); player.attachTTMLRenderingDiv(TTMLRenderingDiv); + player.on('currentTrackChanged', function(e) { + if (e.newMediaInfo.type === 'fragmentedText') { + setTimeout(showDomStorage, 0); + } + }); controlbar = new ControlBar(player); // Checkout ControlBar.js for more info on how to target/add text tracks to UI controlbar.initialize(); + var checkbox = document.getElementById("textDefaultEnabled"); + checkbox.indeterminate = true; + showDomStorage(); + } + + function showDomStorage() { + document.getElementById("domStorage").innerHTML = localStorage.getItem('dashjs_fragmentedText_settings'); + } + + function play() { + var url = FRAGMENTED_CAPTION_URL; + player.attachSource(url); + setTextDefaultEnabled(); + setLang(); + player.play(); + showDomStorage(); + } + + function setTextDefaultEnabled() { + var checkbox = document.getElementById("textDefaultEnabled"); + if (!checkbox.indeterminate) { + player.setTextDefaultEnabled(checkbox.checked); + document.getElementById("textDefaultEnabledValue").innerHTML = checkbox.checked; + } else { + document.getElementById("textDefaultEnabledValue").innerHTML = 'undefined'; + } + } + + function setLang() { + var lang = document.getElementById("textSettings").value; + var role = null; + if (lang) { + if (lang.indexOf('-') != -1) { + var values = lang.split('-'); + lang = values[0]; + role = values[1]; + } + player.setInitialMediaSettingsFor('fragmentedText', { + lang: lang, + role: role + }); + } } @@ -47,12 +86,20 @@ .dash-video-player { width: 640px; } + + .settings { + clear: both; + } + .settings>div { + padding: 5px 0; + } + - +
- +
@@ -85,6 +132,30 @@
+
+
+ + undefined +
+
+ + +
+
+ +
+
+ +
+
+
diff --git a/src/streaming/text/TextController.js b/src/streaming/text/TextController.js index 5570f48d34..d4e1d29c25 100644 --- a/src/streaming/text/TextController.js +++ b/src/streaming/text/TextController.js @@ -364,6 +364,7 @@ function TextController() { } function resetInitialSettings() { + defaultSettings = null; allTracksAreDisabled = true; textTracksAdded = false; disableTextBeforeTextTracksAdded = false; From 03fdef5fb526c6befcc5f7121d10dead5b4cf416 Mon Sep 17 00:00:00 2001 From: Jeff Cunat Date: Tue, 16 Jun 2020 15:34:27 +0200 Subject: [PATCH 3/9] do not reset text settings between load --- contrib/akamai/controlbar/ControlBar.js | 2 ++ samples/captioning/multi-track-captions.html | 29 ++++++++++++++++++-- src/streaming/text/TextController.js | 11 +++++--- test/unit/streaming.text.TextController.js | 4 ++- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/contrib/akamai/controlbar/ControlBar.js b/contrib/akamai/controlbar/ControlBar.js index b7fdbbcf7d..1302792794 100644 --- a/contrib/akamai/controlbar/ControlBar.js +++ b/contrib/akamai/controlbar/ControlBar.js @@ -489,6 +489,8 @@ var ControlBar = function (dashjsMediaPlayer, displayUTCTimeCodes) { menuHandlersList.push(func); captionBtn.addEventListener('click', func); captionBtn.classList.remove('hide'); + } else { + setMenuItemsState(e.index + 1, 'caption-list'); } }; diff --git a/samples/captioning/multi-track-captions.html b/samples/captioning/multi-track-captions.html index 4efbb6b215..1ce0f9900e 100644 --- a/samples/captioning/multi-track-captions.html +++ b/samples/captioning/multi-track-captions.html @@ -34,6 +34,7 @@ controlbar.initialize(); var checkbox = document.getElementById("textDefaultEnabled"); checkbox.indeterminate = true; + document.getElementById("lastMediaSettingsCachingInfoEnabled").checked = player.getSettings().streaming.lastMediaSettingsCachingInfo.enabled; showDomStorage(); } @@ -76,6 +77,20 @@ } } + function setLastMediaSettingsCachingInfoEnabled() { + var checkbox = document.getElementById("lastMediaSettingsCachingInfoEnabled"); + player.updateSettings({ + streaming: { + lastMediaSettingsCachingInfo: { enabled: checkbox.checked } + } + }) + } + + function clearDomStorage() { + localStorage.removeItem('dashjs_fragmentedText_settings'); + showDomStorage(); + } + @@ -133,6 +153,9 @@
+
+ +
undefined @@ -149,11 +172,13 @@
- + +
- +
+
diff --git a/src/streaming/text/TextController.js b/src/streaming/text/TextController.js index d4e1d29c25..02e6e28cd7 100644 --- a/src/streaming/text/TextController.js +++ b/src/streaming/text/TextController.js @@ -55,6 +55,7 @@ function TextController() { ttmlParser, eventBus, defaultSettings, + initialSettingsSet, lastEnabledIndex, textDefaultEnabled, // this is used for default settings (each time a file is loaded, we check value of this settings ) allTracksAreDisabled, // this is used for one session (when a file has been loaded, we use this settings to enable/disable text) @@ -69,6 +70,7 @@ function TextController() { lastEnabledIndex = -1; forceTextStreaming = false; textTracksAdded = false; + initialSettingsSet = false; disableTextBeforeTextTracksAdded = false; textTracks = TextTracks(context).getInstance(); vttParser = VTTParser(context).getInstance(); @@ -78,7 +80,7 @@ function TextController() { textTracks.initialize(); eventBus.on(Events.TEXT_TRACKS_QUEUE_INITIALIZED, onTextTracksAdded, instance); - eventBus.on(Events.CURRENT_TRACK_CHANGED, onSetSettings, instance); + eventBus.on(Events.CURRENT_TRACK_CHANGED, onCurrentTrackChanged, instance); /* * register those event callbacks in order to detect switch of periods and set @@ -178,10 +180,12 @@ function TextController() { defaultSettings = {}; } defaultSettings.lang = lang; + initialSettingsSet = true; } function setInitialSettings(settings) { defaultSettings = settings; + initialSettingsSet = true; } function getTextDefaultLanguage() { @@ -217,8 +221,8 @@ function TextController() { textTracksAdded = true; } - function onSetSettings(event) { - if (!defaultSettings && event && event.newMediaInfo) { + function onCurrentTrackChanged(event) { + if (!initialSettingsSet && event && event.newMediaInfo) { let mediaInfo = event.newMediaInfo; if (mediaInfo.type === Constants.FRAGMENTED_TEXT) { defaultSettings = { @@ -364,7 +368,6 @@ function TextController() { } function resetInitialSettings() { - defaultSettings = null; allTracksAreDisabled = true; textTracksAdded = false; disableTextBeforeTextTracksAdded = false; diff --git a/test/unit/streaming.text.TextController.js b/test/unit/streaming.text.TextController.js index cffca5278e..9f3a6f4b53 100644 --- a/test/unit/streaming.text.TextController.js +++ b/test/unit/streaming.text.TextController.js @@ -40,7 +40,9 @@ describe('TextController', function () { }); afterEach(function () { - delete global.document; + if (global !== window) { + delete global.document; + } }); beforeEach(function () { From f7cb33de9ab563e7b73aceab742371f1270c38ae Mon Sep 17 00:00:00 2001 From: Jeff Cunat Date: Tue, 16 Jun 2020 09:00:13 +0200 Subject: [PATCH 4/9] modify multi captions test to ease multiple configuration (default, domStorage, initial settings...) --- test/unit/streaming.text.TextController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/streaming.text.TextController.js b/test/unit/streaming.text.TextController.js index 9f3a6f4b53..1bc727230f 100644 --- a/test/unit/streaming.text.TextController.js +++ b/test/unit/streaming.text.TextController.js @@ -40,7 +40,7 @@ describe('TextController', function () { }); afterEach(function () { - if (global !== window) { + if (typeof window !== 'undefined' && global !== window) { delete global.document; } }); From f7b2f6febea29225d21e76a755206c0c88adb626 Mon Sep 17 00:00:00 2001 From: Jeff Cunat Date: Mon, 6 Jul 2020 15:16:01 +0200 Subject: [PATCH 5/9] fix pb when calling setTextDefaultEnabled(false) before player initialization --- samples/captioning/multi-track-captions.html | 2 +- src/streaming/text/TextController.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/samples/captioning/multi-track-captions.html b/samples/captioning/multi-track-captions.html index 1ce0f9900e..2329076c29 100644 --- a/samples/captioning/multi-track-captions.html +++ b/samples/captioning/multi-track-captions.html @@ -54,8 +54,8 @@ function setTextDefaultEnabled() { var checkbox = document.getElementById("textDefaultEnabled"); if (!checkbox.indeterminate) { - player.setTextDefaultEnabled(checkbox.checked); document.getElementById("textDefaultEnabledValue").innerHTML = checkbox.checked; + player.setTextDefaultEnabled(checkbox.checked); } else { document.getElementById("textDefaultEnabledValue").innerHTML = 'undefined'; } diff --git a/src/streaming/text/TextController.js b/src/streaming/text/TextController.js index 02e6e28cd7..a363ed1cc8 100644 --- a/src/streaming/text/TextController.js +++ b/src/streaming/text/TextController.js @@ -300,12 +300,11 @@ function TextController() { allTracksAreDisabled = idx === -1 ? true : false; - if (allTracksAreDisabled) { - mediaController.saveTextSettingsDisabled(); - } - let oldTrackIdx = textTracks.getCurrentTrackIdx(); if (oldTrackIdx !== idx) { + if (allTracksAreDisabled && mediaController) { + mediaController.saveTextSettingsDisabled(); + } textTracks.setModeForTrackIdx(oldTrackIdx, Constants.TEXT_HIDDEN); textTracks.setCurrentTrackIdx(idx); textTracks.setModeForTrackIdx(idx, Constants.TEXT_SHOWING); From a5edca1dd798c3e2a191da608fe59b5f2df57640 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Wed, 15 Jul 2020 08:47:08 +0200 Subject: [PATCH 6/9] use /* */ for comments in sample page code --- samples/captioning/multi-track-captions.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/captioning/multi-track-captions.html b/samples/captioning/multi-track-captions.html index 2329076c29..948e091285 100644 --- a/samples/captioning/multi-track-captions.html +++ b/samples/captioning/multi-track-captions.html @@ -13,7 +13,7 @@