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