From 3f87bb839a6d731248bbb6134f14cd3445f5264d Mon Sep 17 00:00:00 2001 From: Luke-Chatburn Date: Thu, 3 Jul 2025 13:48:40 +0100 Subject: [PATCH 1/2] Ensure no type errors if no audio in stream. --- src/playbackstrategy/msestrategy.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/playbackstrategy/msestrategy.js b/src/playbackstrategy/msestrategy.js index 11722c58..f156c0e4 100644 --- a/src/playbackstrategy/msestrategy.js +++ b/src/playbackstrategy/msestrategy.js @@ -376,9 +376,11 @@ function MSEStrategy( } function dispatchMaxQualityChangeForKind(kind) { - const { qualityIndex, bitrate: bitrateInBps } = mediaPlayer.getTopBitrateInfoFor(kind) + const { qualityIndex, bitrate: bitrateInBps } = mediaPlayer.getTopBitrateInfoFor(kind) ?? {} - DebugTool.dynamicMetric(`${kind}-max-quality`, [qualityIndex, bitrateInBps]) + if (qualityIndex && bitrateInBps) { + DebugTool.dynamicMetric(`${kind}-max-quality`, [qualityIndex, bitrateInBps]) + } } function getBufferedRanges() { @@ -415,7 +417,7 @@ function MSEStrategy( const bitrateInfoList = mediaPlayer.getBitrateInfoListFor(mediaKind) - return bitrateInfoList?.[index].bitrate ?? 0 + return bitrateInfoList?.[index]?.bitrate ?? 0 } function onQualityChangeRequested(event) { From f08af53e09d19ed4b75a98d599652710b0af196d Mon Sep 17 00:00:00 2001 From: Luke-Chatburn Date: Tue, 8 Jul 2025 15:12:41 +0100 Subject: [PATCH 2/2] Use getHasTrack from dash --- src/playbackstrategy/msestrategy.js | 16 ++++++++-------- src/playbackstrategy/msestrategy.test.js | 4 ++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/playbackstrategy/msestrategy.js b/src/playbackstrategy/msestrategy.js index f156c0e4..cade7d13 100644 --- a/src/playbackstrategy/msestrategy.js +++ b/src/playbackstrategy/msestrategy.js @@ -327,13 +327,15 @@ function MSEStrategy( mediaPlayer.setMediaDuration(Number.MAX_SAFE_INTEGER) } - if (mediaKind === MediaKinds.VIDEO) { + if (mediaPlayer.getActiveStream()?.getHasVideoTrack()) { dispatchDownloadQualityChangeForKind(MediaKinds.VIDEO) dispatchMaxQualityChangeForKind(MediaKinds.VIDEO) } - dispatchMaxQualityChangeForKind(MediaKinds.AUDIO) - dispatchDownloadQualityChangeForKind(MediaKinds.AUDIO) + if (mediaPlayer.getActiveStream()?.getHasAudioTrack()) { + dispatchMaxQualityChangeForKind(MediaKinds.AUDIO) + dispatchDownloadQualityChangeForKind(MediaKinds.AUDIO) + } emitPlayerInfo() } @@ -376,11 +378,9 @@ function MSEStrategy( } function dispatchMaxQualityChangeForKind(kind) { - const { qualityIndex, bitrate: bitrateInBps } = mediaPlayer.getTopBitrateInfoFor(kind) ?? {} + const { qualityIndex, bitrate: bitrateInBps } = mediaPlayer.getTopBitrateInfoFor(kind) - if (qualityIndex && bitrateInBps) { - DebugTool.dynamicMetric(`${kind}-max-quality`, [qualityIndex, bitrateInBps]) - } + DebugTool.dynamicMetric(`${kind}-max-quality`, [qualityIndex, bitrateInBps]) } function getBufferedRanges() { @@ -417,7 +417,7 @@ function MSEStrategy( const bitrateInfoList = mediaPlayer.getBitrateInfoListFor(mediaKind) - return bitrateInfoList?.[index]?.bitrate ?? 0 + return bitrateInfoList?.[index].bitrate ?? 0 } function onQualityChangeRequested(event) { diff --git a/src/playbackstrategy/msestrategy.test.js b/src/playbackstrategy/msestrategy.test.js index c052db37..e7b0b48f 100644 --- a/src/playbackstrategy/msestrategy.test.js +++ b/src/playbackstrategy/msestrategy.test.js @@ -1626,6 +1626,7 @@ describe("Media Source Extensions Playback Strategy", () => { mockDashInstance.isReady.mockReturnValue(true) mockDashInstance.getTopBitrateInfoFor.mockReturnValue({ qualityIndex: 2, bitrate: 3000000 }) + mockDashInstance.getActiveStream.mockReturnValue({ getHasVideoTrack: () => true, getHasAudioTrack: () => true }) dispatchDashEvent(dashjsMediaPlayerEvents.STREAM_INITIALIZED) @@ -1650,6 +1651,7 @@ describe("Media Source Extensions Playback Strategy", () => { mockDashInstance.isReady.mockReturnValue(true) mockDashInstance.getTopBitrateInfoFor.mockReturnValue({ qualityIndex: 2, bitrate: 3000000 }) + mockDashInstance.getActiveStream.mockReturnValue({ getHasVideoTrack: () => true, getHasAudioTrack: () => true }) dispatchDashEvent(dashjsMediaPlayerEvents.STREAM_INITIALIZED) @@ -1674,6 +1676,7 @@ describe("Media Source Extensions Playback Strategy", () => { mockDashInstance.isReady.mockReturnValue(true) mockDashInstance.getTopBitrateInfoFor.mockReturnValue({ qualityIndex: 2, bitrate: 3000000 }) + mockDashInstance.getActiveStream.mockReturnValue({ getHasVideoTrack: () => true, getHasAudioTrack: () => true }) dispatchDashEvent(dashjsMediaPlayerEvents.STREAM_INITIALIZED) @@ -1698,6 +1701,7 @@ describe("Media Source Extensions Playback Strategy", () => { mockDashInstance.isReady.mockReturnValue(true) mockDashInstance.getTopBitrateInfoFor.mockReturnValue({ qualityIndex: 2, bitrate: 3000000 }) + mockDashInstance.getActiveStream.mockReturnValue({ getHasVideoTrack: () => true, getHasAudioTrack: () => true }) dispatchDashEvent(dashjsMediaPlayerEvents.STREAM_INITIALIZED)