From aca0fb09bc4d90491f93073227edcaa579687aac Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Sat, 7 Dec 2019 20:29:14 +0100 Subject: [PATCH 1/4] Simplify vtt subtitle offset (firefox compatibility) --- src/components/htmlvideoplayer/plugin.js | 50 +++++++++++++----------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index ac4e8cf6a5..4512fb43d1 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -575,6 +575,20 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return showTrackOffset; } + function getTextTrack() { + var videoElement = self._mediaElement; + if (videoElement) { + return Array.from(videoElement.textTracks) + .find(function(trackElement) { + // get showing .vtt textTack + return trackElement.mode === 'showing'; + }); + } else { + // get track events + return currentTrackEvents; + } + } + self.setSubtitleOffset = function(offset) { var offsetValue = parseFloat(offset); @@ -583,28 +597,14 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa if (currentAssRenderer) { updateCurrentTrackOffset(offsetValue); } else { - var videoElement = self._mediaElement; - var mediaStreamTextTracks = getMediaStreamTextTracks(self._currentPlayOptions.mediaSource); - - Array.from(videoElement.textTracks) - .filter(function(trackElement) { - // get showing .vtt textTacks - return trackElement.mode === 'showing'; - }) - .forEach(function(trackElement) { - - var track = customTrackIndex === -1 ? null : mediaStreamTextTracks.filter(function (t) { - return t.Index === customTrackIndex; - })[0]; - - if (track) { - offsetValue = updateCurrentTrackOffset(offsetValue); - setVttSubtitleOffset(trackElement, offsetValue); - } else { - console.log("No available track, cannot apply offset : " + offsetValue); - } - - }); + var trackElement = getTextTrack(); + // if .vtt currently rendering + if (trackElement) { + offsetValue = updateCurrentTrackOffset(offsetValue); + setVttSubtitleOffset(trackElement, offsetValue); + } else { + console.log("No available track, cannot apply offset : " + offsetValue); + } } }; @@ -628,8 +628,12 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa cue.startTime -= offsetValue; cue.endTime -= offsetValue; }); + } else if (Array.isArray(currentTrack)) { + currentTrack.forEach(function(trackEvent) { + trackEvent.StartPositionTicks -= offsetValue; + trackEvent.EndPositionTicks -= offsetValue; + }); } - } self.getSubtitleOffset = function() { From b0d4b94140926b897e4245ccd02d654910a1b44e Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Mon, 9 Dec 2019 21:37:05 +0100 Subject: [PATCH 2/4] reset subtitle offset on track change --- src/components/htmlvideoplayer/plugin.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index 4512fb43d1..c8716c4e05 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -579,10 +579,10 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var videoElement = self._mediaElement; if (videoElement) { return Array.from(videoElement.textTracks) - .find(function(trackElement) { - // get showing .vtt textTack - return trackElement.mode === 'showing'; - }); + .find(function(trackElement) { + // get showing .vtt textTack + return trackElement.mode === 'showing'; + }); } else { // get track events return currentTrackEvents; @@ -603,7 +603,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa offsetValue = updateCurrentTrackOffset(offsetValue); setVttSubtitleOffset(trackElement, offsetValue); } else { - console.log("No available track, cannot apply offset : " + offsetValue); + console.log("No available track, cannot apply offset : ", offsetValue); } } }; @@ -1022,6 +1022,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return; } + self.resetSubtitleOffset(); var item = self._currentPlayOptions.item; destroyCustomTrack(videoElement); From 547dbf5d6754870e27b0c4b397aa8cd1e0e7d91d Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Mon, 16 Dec 2019 17:49:38 +0100 Subject: [PATCH 3/4] Update src/components/htmlvideoplayer/plugin.js Co-Authored-By: dkanada --- src/components/htmlvideoplayer/plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index c8716c4e05..f6011302cf 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -603,7 +603,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa offsetValue = updateCurrentTrackOffset(offsetValue); setVttSubtitleOffset(trackElement, offsetValue); } else { - console.log("No available track, cannot apply offset : ", offsetValue); + console.log("No available track, cannot apply offset: ", offsetValue); } } }; From 8f60d62919d029299365c5822ca19d9dcba3ad3c Mon Sep 17 00:00:00 2001 From: redSpoutnik <15638041+redSpoutnik@users.noreply.github.com> Date: Tue, 7 Jan 2020 21:12:25 +0100 Subject: [PATCH 4/4] subtitle-sync: set explicit methods for textTracks and trackEvents. --- src/components/htmlvideoplayer/plugin.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/components/htmlvideoplayer/plugin.js b/src/components/htmlvideoplayer/plugin.js index f6011302cf..e721951c58 100644 --- a/src/components/htmlvideoplayer/plugin.js +++ b/src/components/htmlvideoplayer/plugin.js @@ -584,8 +584,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return trackElement.mode === 'showing'; }); } else { - // get track events - return currentTrackEvents; + return null; } } @@ -600,8 +599,9 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa var trackElement = getTextTrack(); // if .vtt currently rendering if (trackElement) { - offsetValue = updateCurrentTrackOffset(offsetValue); - setVttSubtitleOffset(trackElement, offsetValue); + setTextTrackSubtitleOffset(trackElement, offsetValue); + } else if (currentTrackEvents) { + setTrackEventsSubtitleOffset(currentTrackEvents, offsetValue); } else { console.log("No available track, cannot apply offset: ", offsetValue); } @@ -620,16 +620,23 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa return relativeOffset; } - function setVttSubtitleOffset(currentTrack, offsetValue) { + function setTextTrackSubtitleOffset(currentTrack, offsetValue) { if (currentTrack.cues) { + offsetValue = updateCurrentTrackOffset(offsetValue); Array.from(currentTrack.cues) .forEach(function(cue) { cue.startTime -= offsetValue; cue.endTime -= offsetValue; }); - } else if (Array.isArray(currentTrack)) { - currentTrack.forEach(function(trackEvent) { + } + } + + function setTrackEventsSubtitleOffset(trackEvents, offsetValue) { + + if (Array.isArray(trackEvents)) { + offsetValue = updateCurrentTrackOffset(offsetValue); + trackEvents.forEach(function(trackEvent) { trackEvent.StartPositionTicks -= offsetValue; trackEvent.EndPositionTicks -= offsetValue; });