From 0206e5af8e4e1ea1415a8144470b0f12689ef9aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Tue, 14 May 2024 10:28:06 +0200 Subject: [PATCH] feat: Add a new setting to allow remove based on channels count (#6600) Close https://github.com/shaka-project/shaka-player/issues/6491 --- demo/config.js | 4 +++- externs/shaka/player.js | 10 +++++++++- lib/util/player_configuration.js | 4 ++++ lib/util/stream_utils.js | 12 +++++++++++- test/player_unit.js | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/demo/config.js b/demo/config.js index 22b6fb984b..7cddc6bdac 100644 --- a/demo/config.js +++ b/demo/config.js @@ -382,7 +382,9 @@ shakaDemo.Config = class { .addNumberInput_('Min Framerate', prefix + 'minFrameRate') .addNumberInput_('Max Framerate', prefix + 'maxFrameRate') .addNumberInput_('Min Bandwidth', prefix + 'minBandwidth') - .addNumberInput_('Max Bandwidth', prefix + 'maxBandwidth'); + .addNumberInput_('Max Bandwidth', prefix + 'maxBandwidth') + .addNumberInput_('Min Channels Count', prefix + 'minChannelsCount') + .addNumberInput_('Max Channels Count', prefix + 'maxChannelsCount'); } /** diff --git a/externs/shaka/player.js b/externs/shaka/player.js index d9554ef4fe..1bc7c1994d 100644 --- a/externs/shaka/player.js +++ b/externs/shaka/player.js @@ -392,7 +392,10 @@ shaka.extern.TrackList; * maxFrameRate: number, * * minBandwidth: number, - * maxBandwidth: number + * maxBandwidth: number, + * + * minChannelsCount: number, + * maxChannelsCount: number * }} * * @description @@ -429,6 +432,11 @@ shaka.extern.TrackList; * The minimum bandwidth of a variant track, in bit/sec. * @property {number} maxBandwidth * The maximum bandwidth of a variant track, in bit/sec. + * + * @property {number} minChannelsCount + * The minimum channels count of a variant track. + * @property {number} maxChannelsCount + * The maximum channels count of a variant track. * @exportDoc */ shaka.extern.Restrictions; diff --git a/lib/util/player_configuration.js b/lib/util/player_configuration.js index 75b4db1e5c..661feba9a1 100644 --- a/lib/util/player_configuration.js +++ b/lib/util/player_configuration.js @@ -317,6 +317,8 @@ shaka.util.PlayerConfiguration = class { maxFrameRate: Infinity, minBandwidth: 0, maxBandwidth: Infinity, + minChannelsCount: 0, + maxChannelsCount: Infinity, }, advanced: { minTotalBytes: 128e3, @@ -426,6 +428,8 @@ shaka.util.PlayerConfiguration = class { maxFrameRate: Infinity, minBandwidth: 0, maxBandwidth: Infinity, + minChannelsCount: 0, + maxChannelsCount: Infinity, }, playRangeStart: 0, playRangeEnd: Infinity, diff --git a/lib/util/stream_utils.js b/lib/util/stream_utils.js index 4327448482..5e48afd5bd 100644 --- a/lib/util/stream_utils.js +++ b/lib/util/stream_utils.js @@ -289,7 +289,7 @@ shaka.util.StreamUtils = class { } } - // |variant.frameRate| can be undefined, which breaks + // |variant.video.frameRate| can be undefined, which breaks // the math, so make sure they are there first. if (variant && variant.video && variant.video.frameRate) { if (!inRange(variant.video.frameRate, @@ -299,6 +299,16 @@ shaka.util.StreamUtils = class { } } + // |variant.audio.channelsCount| can be undefined, which breaks + // the math, so make sure they are there first. + if (variant && variant.audio && variant.audio.channelsCount) { + if (!inRange(variant.audio.channelsCount, + restrictions.minChannelsCount, + restrictions.maxChannelsCount)) { + return false; + } + } + if (!inRange(variant.bandwidth, restrictions.minBandwidth, restrictions.maxBandwidth)) { diff --git a/test/player_unit.js b/test/player_unit.js index 88b5d12580..e545b2f96b 100644 --- a/test/player_unit.js +++ b/test/player_unit.js @@ -3616,6 +3616,38 @@ describe('Player', () => { expect(tracks[0].id).toBe(1); }); + it('removes based on channelsCount', async () => { + manifest = shaka.test.ManifestGenerator.generate((manifest) => { + manifest.addVariant(0, (variant) => { + variant.addAudio(1, (stream) => { + stream.channelsCount = 1; + }); + }); + + manifest.addVariant(1, (variant) => { + variant.addAudio(2, (stream) => { + stream.channelsCount = 2; + }); + }); + + manifest.addVariant(2, (variant) => { + variant.addAudio(3, (stream) => { + stream.channelsCount = 6; + }); + }); + }); + + await player.load(fakeManifestUri, 0, fakeMimeType); + expect(player.getVariantTracks().length).toBe(3); + + player.configure({restrictions: + {minChannelsCount: 2, maxChannelsCount: 4}}); + + const tracks = player.getVariantTracks(); + expect(tracks.length).toBe(1); + expect(tracks[0].id).toBe(1); + }); + it('removes the whole variant if one stream is restricted', async () => { manifest = shaka.test.ManifestGenerator.generate((manifest) => { manifest.addVariant(0, (variant) => {