From dfb369935b9e84fe69a7d38c7904fb0e00dc064a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Tue, 25 Jan 2022 19:20:42 +0100 Subject: [PATCH] fix: Fix misdetection of HEVC support on MS Edge (#3897) The proposed solution checks that all variants, apart from being checked in mediaCapabilities.decodingInfo, are also checked with MediaSource.isTypeSupported There are some browser implementations that return a true mediaCapabilities.decodingInfo for unknown mimetypes and codecs and that can cause an application-level problem. For example, EDGE on Windows 10 returns true to HEVC even if you don't have the extension installed to support HEVC, instead MediaSource.isTypeSupported does take this into account Fixes: #3860 --- lib/util/stream_utils.js | 61 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/lib/util/stream_utils.js b/lib/util/stream_utils.js index 92866c18bf..36df2a3399 100644 --- a/lib/util/stream_utils.js +++ b/lib/util/stream_utils.js @@ -425,7 +425,42 @@ shaka.util.StreamUtils = class { await shaka.util.StreamUtils.getDecodingInfosForVariants( manifest.variants, usePersistentLicenses, /* srcEquals= */ false); manifest.variants = manifest.variants.filter((variant) => { + // See: https://github.com/google/shaka-player/issues/3860 const video = variant.video; + const ContentType = shaka.util.ManifestParserUtils.ContentType; + if (video) { + let videoCodecs = shaka.util.StreamUtils.patchVp9(video.codecs); + // For multiplexed streams. Here we must check the audio of the + // stream to see if it is compatible. + if (video.codecs.includes(',')) { + const allCodecs = video.codecs.split(','); + videoCodecs = shaka.util.ManifestParserUtils.guessCodecs( + ContentType.VIDEO, allCodecs); + const audioCodecs = shaka.util.ManifestParserUtils.guessCodecs( + ContentType.AUDIO, allCodecs); + const audioFullType = shaka.util.MimeUtils.getFullOrConvertedType( + video.mimeType, audioCodecs, ContentType.AUDIO); + if (!MediaSource.isTypeSupported(audioFullType)) { + return false; + } + } + const fullType = shaka.util.MimeUtils.getFullOrConvertedType( + video.mimeType, videoCodecs, ContentType.VIDEO); + if (!MediaSource.isTypeSupported(fullType)) { + return false; + } + } + const audio = variant.audio; + if (audio) { + const codecs = + shaka.util.StreamUtils.getCorrectAudioCodecs_(audio.codecs); + const fullType = shaka.util.MimeUtils.getFullOrConvertedType( + audio.mimeType, codecs, ContentType.AUDIO); + if (!MediaSource.isTypeSupported(fullType)) { + return false; + } + } + // See: https://github.com/google/shaka-player/issues/3380 if (shaka.util.Platform.isXboxOne() && video && ((video.width && video.width > 1920) || @@ -562,12 +597,8 @@ shaka.util.StreamUtils = class { } } if (audio) { - // Some Tizen devices seem to misreport AC-3 support, but correctly - // report EC-3 support. So query EC-3 as a fallback for AC-3. - // See https://github.com/google/shaka-player/issues/2989 for details. const codecs = - (audio.codecs.toLowerCase() == 'ac-3' && - shaka.util.Platform.isTizen()) ? 'ec-3' : audio.codecs; + shaka.util.StreamUtils.getCorrectAudioCodecs_(audio.codecs); const fullType = shaka.util.MimeUtils.getFullOrConvertedType( audio.mimeType, codecs, ContentType.AUDIO); @@ -678,6 +709,26 @@ shaka.util.StreamUtils = class { return configs; } + + /** + * Generates the correct audio codec for MediaDecodingConfiguration and + * for MediaSource.isTypeSupported. + * @param {string} codecs + * @return {string} + * @private + */ + static getCorrectAudioCodecs_(codecs) { + // Some Tizen devices seem to misreport AC-3 support, but correctly + // report EC-3 support. So query EC-3 as a fallback for AC-3. + // See https://github.com/google/shaka-player/issues/2989 for details. + if (shaka.util.Platform.isTizen()) { + return codecs.toLowerCase() == 'ac-3' ? 'ec-3' : codecs; + } else { + return codecs; + } + } + + /** * MediaCapabilities supports 'vp09...' codecs, but not 'vp9'. Translate vp9 * codec strings into 'vp09...', to allow such content to play with