Skip to content

Commit

Permalink
fix: Fix misdetection of HEVC support on MS Edge (#3897)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Álvaro Velad Galván committed Jan 25, 2022
1 parent d1f00b8 commit dfb3699
Showing 1 changed file with 56 additions and 5 deletions.
61 changes: 56 additions & 5 deletions lib/util/stream_utils.js
Expand Up @@ -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) ||
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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
Expand Down

0 comments on commit dfb3699

Please sign in to comment.