diff --git a/.releasinator.json b/.releasinator.json index 4f0ed58f..b72a3be3 100644 --- a/.releasinator.json +++ b/.releasinator.json @@ -5,4 +5,4 @@ "displayPattern": "$.$.$", "enforceUserFacingLabel": false, "projectType": "npm-like" -} \ No newline at end of file +} diff --git a/src/playbackstrategy/msestrategy.js b/src/playbackstrategy/msestrategy.js index 5244bfaf..9b48b170 100644 --- a/src/playbackstrategy/msestrategy.js +++ b/src/playbackstrategy/msestrategy.js @@ -85,6 +85,7 @@ function MSEStrategy( }, playbackBitrate: undefined, bufferLength: undefined, + latency: undefined, fragmentInfo: { requestTime: undefined, numDownloaded: undefined, @@ -115,6 +116,7 @@ function MSEStrategy( QUOTA_EXCEEDED: "quotaExceeded", TEXT_TRACKS_ADDED: "allTextTracksAdded", CURRENT_TRACK_CHANGED: "currentTrackChanged", + PLAYBACK_RATE_CHANGED: "playbackRateChanged", } function onLoadedMetaData() { @@ -344,6 +346,7 @@ function MSEStrategy( Plugins.interface.onPlayerInfoUpdated({ bufferLength: playerMetadata.bufferLength, playbackBitrate: playerMetadata.playbackBitrate, + latency: playerMetadata.latency, }) } @@ -480,11 +483,13 @@ function MSEStrategy( dashMetrics = mediaPlayer.getDashMetrics() if (dashMetrics) { + playerMetadata.latency = mediaPlayer.getCurrentLiveLatency() playerMetadata.bufferLength = dashMetrics.getCurrentBufferLevel(event.mediaType) DebugTool.staticMetric("buffer-length", playerMetadata.bufferLength) Plugins.interface.onPlayerInfoUpdated({ bufferLength: playerMetadata.bufferLength, playbackBitrate: playerMetadata.playbackBitrate, + latency: playerMetadata.latency, }) } } @@ -692,6 +697,11 @@ function MSEStrategy( mediaPlayer.on(DashJSEvents.TEXT_TRACKS_ADDED, handleTextTracks) mediaPlayer.on(DashJSEvents.MANIFEST_LOADING_FINISHED, manifestLoadingFinished) mediaPlayer.on(DashJSEvents.CURRENT_TRACK_CHANGED, onCurrentTrackChanged) + mediaPlayer.on(DashJSEvents.PLAYBACK_RATE_CHANGED, onPlaybackRateChanged) + } + + function onPlaybackRateChanged(event) { + Plugins.interface.onPlaybackRateChanged(event) } function handleTextTracks() { @@ -880,7 +890,7 @@ function MSEStrategy( mediaPlayer.off(DashJSEvents.GAP_JUMP_TO_END, onGapJump) mediaPlayer.off(DashJSEvents.QUOTA_EXCEEDED, onQuotaExceeded) mediaPlayer.off(DashJSEvents.CURRENT_TRACK_CHANGED, onCurrentTrackChanged) - + mediaPlayer.off(DashJSEvents.PLAYBACK_RATE_CHANGED, onPlaybackRateChanged) mediaPlayer = undefined } diff --git a/src/playbackstrategy/msestrategy.test.js b/src/playbackstrategy/msestrategy.test.js index 2aab3d1f..5d2b847e 100644 --- a/src/playbackstrategy/msestrategy.test.js +++ b/src/playbackstrategy/msestrategy.test.js @@ -646,6 +646,7 @@ describe("Media Source Extensions Playback Strategy", () => { expect(Plugins.interface.onPlayerInfoUpdated).toHaveBeenCalledWith({ playbackBitrate: undefined, + latency: undefined, bufferLength: 15, }) }) diff --git a/src/plugins.js b/src/plugins.js index 5c077485..8a176f9d 100644 --- a/src/plugins.js +++ b/src/plugins.js @@ -50,5 +50,6 @@ export default { onSubtitlesDynamicLoadError: (evt) => callOnAllPlugins("onSubtitlesDynamicLoadError", evt), onFragmentContentLengthMismatch: (evt) => callOnAllPlugins("onFragmentContentLengthMismatch", evt), onQuotaExceeded: (evt) => callOnAllPlugins("onQuotaExceeded", evt), + onPlaybackRateChanged: (evt) => callOnAllPlugins("onPlaybackRateChanged", evt), }, }