From bc0b9f2ab4b37ffbaeddec684eae4d545413bcd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Wed, 20 Nov 2024 09:33:36 +0100 Subject: [PATCH] fix(Cast): Incorrect detection of MediaCapabilities on Linux Chromecast (#7628) Fixes https://github.com/shaka-project/shaka-player/issues/5776 --- lib/polyfill/media_capabilities.js | 13 ++++++++++--- test/polyfill/media_capabilities_unit.js | 12 ++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/polyfill/media_capabilities.js b/lib/polyfill/media_capabilities.js index 4ced382a5e..c579d81f1c 100644 --- a/lib/polyfill/media_capabilities.js +++ b/lib/polyfill/media_capabilities.js @@ -327,11 +327,18 @@ shaka.polyfill.MediaCapabilities = class { let displayType = videoConfig.contentType; if (videoConfig.width && videoConfig.height) { - displayType += - `; width=${videoConfig.width}; height=${videoConfig.height}`; + // All Chromecast can support 720p videos + if (videoConfig.width > 1280 || videoConfig.height > 720) { + displayType += + `; width=${videoConfig.width}; height=${videoConfig.height}`; + } } if (videoConfig.framerate) { - displayType += `; framerate=${videoConfig.framerate}`; + // All Chromecast can support a framerate of 24, 25 or 30. + const framerate = Math.round(videoConfig.framerate); + if (framerate < 24 || framerate > 30) { + displayType += `; framerate=${videoConfig.framerate}`; + } } // Don't trust Closure types here. Although transferFunction is string or diff --git a/test/polyfill/media_capabilities_unit.js b/test/polyfill/media_capabilities_unit.js index 3973ec7c8a..3c5a1a8dce 100644 --- a/test/polyfill/media_capabilities_unit.js +++ b/test/polyfill/media_capabilities_unit.js @@ -64,8 +64,8 @@ describe('MediaCapabilities', () => { bitrate: 349265, contentType: 'video/mp4; codecs="avc1.4D4015"', framerate: 23.976023976023978, - height: 288, - width: 512, + height: 1080, + width: 1920, }, }; shaka.util.DrmUtils.clearMediaKeySystemAccessMap(); @@ -258,14 +258,14 @@ describe('MediaCapabilities', () => { 'video/mp4; codecs="hev1.2.4.L153.B0"'; // Round to a whole number since we can't rely on number => string // conversion precision on all devices. - mockDecodingConfig.video.framerate = 24; + mockDecodingConfig.video.framerate = 60; const chromecastType = 'video/mp4; ' + 'codecs="hev1.2.4.L153.B0"; ' + - 'width=512; ' + - 'height=288; ' + - 'framerate=24; ' + + 'width=1920; ' + + 'height=1080; ' + + 'framerate=60; ' + 'eotf=smpte2084'; mockCanDisplayType.and.callFake((type) => { expect(type).toBe(chromecastType);