diff --git a/lib/media/drm_engine.js b/lib/media/drm_engine.js index f90e2f48e8..794d426a72 100644 --- a/lib/media/drm_engine.js +++ b/lib/media/drm_engine.js @@ -934,14 +934,16 @@ shaka.media.DrmEngine = class { 'Got MediaKeySystemAccess with configuration', realConfig); + const keySystem = + this.config_.keySystemsMapping[mediaKeySystemAccess.keySystem] || + mediaKeySystemAccess.keySystem; + if (variants.length) { this.currentDrmInfo_ = this.createDrmInfoByInfos_( - mediaKeySystemAccess.keySystem, - drmInfosByKeySystem.get(mediaKeySystemAccess.keySystem)); + keySystem, drmInfosByKeySystem.get(keySystem)); } else { this.currentDrmInfo_ = shaka.media.DrmEngine.createDrmInfoByConfigs_( - mediaKeySystemAccess.keySystem, - configsByKeySystem.get(mediaKeySystemAccess.keySystem)); + keySystem, configsByKeySystem.get(keySystem)); } if (!this.currentDrmInfo_.licenseServerUri) { throw new shaka.util.Error( @@ -1056,8 +1058,12 @@ shaka.media.DrmEngine = class { if (!decodingInfo.supported || !decodingInfo.keySystemAccess) { continue; } - const drmInfos = - drmInfosByKeySystem.get(decodingInfo.keySystemAccess.keySystem); + const originalKeySystem = decodingInfo.keySystemAccess.keySystem; + let drmInfos = drmInfosByKeySystem.get(originalKeySystem); + if (!drmInfos && this.config_.keySystemsMapping[originalKeySystem]) { + drmInfos = drmInfosByKeySystem.get( + this.config_.keySystemsMapping[originalKeySystem]); + } for (const info of drmInfos) { if (!!info.licenseServerUri == shouldHaveLicenseServer) { return decodingInfo.keySystemAccess; diff --git a/lib/media/manifest_filterer.js b/lib/media/manifest_filterer.js index 30ecbd13a5..e0601fe5e2 100644 --- a/lib/media/manifest_filterer.js +++ b/lib/media/manifest_filterer.js @@ -50,7 +50,8 @@ shaka.media.ManifestFilterer = class { async filterManifest(manifest) { goog.asserts.assert(manifest, 'Manifest should exist!'); await shaka.util.StreamUtils.filterManifest(this.drmEngine_, manifest, - this.config_.drm.preferredKeySystems); + this.config_.drm.preferredKeySystems, + this.config_.drm.keySystemsMapping); if (!this.config_.streaming.dontChooseCodecs) { shaka.util.StreamUtils.chooseCodecsAndFilterManifest( manifest, diff --git a/lib/offline/storage.js b/lib/offline/storage.js index e73a30822e..212a38a300 100644 --- a/lib/offline/storage.js +++ b/lib/offline/storage.js @@ -702,7 +702,7 @@ shaka.offline.Storage = class { // to play later (no point storing something we can't play). await shaka.util.StreamUtils.filterManifestByMediaCapabilities( drmEngine, manifest, config.offline.usePersistentLicense, - config.drm.preferredKeySystems); + config.drm.preferredKeySystems, config.drm.keySystemsMapping); // Gather all tracks. const allTracks = []; diff --git a/lib/util/stream_utils.js b/lib/util/stream_utils.js index 1517ac5112..4bdcbd1e0b 100644 --- a/lib/util/stream_utils.js +++ b/lib/util/stream_utils.js @@ -393,11 +393,13 @@ shaka.util.StreamUtils = class { * @param {shaka.media.DrmEngine} drmEngine * @param {shaka.extern.Manifest} manifest * @param {!Array=} preferredKeySystems + * @param {!Object.=} keySystemsMapping */ - static async filterManifest(drmEngine, manifest, preferredKeySystems = []) { + static async filterManifest(drmEngine, manifest, preferredKeySystems = [], + keySystemsMapping = {}) { await shaka.util.StreamUtils.filterManifestByMediaCapabilities( drmEngine, manifest, manifest.offlineSessionIds.length > 0, - preferredKeySystems); + preferredKeySystems, keySystemsMapping); shaka.util.StreamUtils.filterTextStreams_(manifest); await shaka.util.StreamUtils.filterImageStreams_(manifest); } @@ -411,9 +413,11 @@ shaka.util.StreamUtils = class { * @param {shaka.extern.Manifest} manifest * @param {boolean} usePersistentLicenses * @param {!Array} preferredKeySystems + * @param {!Object.} keySystemsMapping */ static async filterManifestByMediaCapabilities( - drmEngine, manifest, usePersistentLicenses, preferredKeySystems) { + drmEngine, manifest, usePersistentLicenses, preferredKeySystems, + keySystemsMapping) { goog.asserts.assert(navigator.mediaCapabilities, 'MediaCapabilities should be valid.'); @@ -435,7 +439,8 @@ shaka.util.StreamUtils = class { const StreamUtils = shaka.util.StreamUtils; manifest.variants = manifest.variants.filter((variant) => { - const supported = StreamUtils.checkVariantSupported_(variant, keySystem); + const supported = StreamUtils.checkVariantSupported_( + variant, keySystem, keySystemsMapping); // Filter out all unsupported variants. if (!supported) { shaka.log.debug('Dropping variant - not compatible with platform', @@ -485,10 +490,11 @@ shaka.util.StreamUtils = class { /** * @param {!shaka.extern.Variant} variant * @param {?string} keySystem + * @param {!Object.} keySystemsMapping * @return {boolean} * @private */ - static checkVariantSupported_(variant, keySystem) { + static checkVariantSupported_(variant, keySystem, keySystemsMapping) { const variantSupported = variant.decodingInfos.some((decodingInfo) => { if (!decodingInfo.supported) { return false; @@ -496,7 +502,10 @@ shaka.util.StreamUtils = class { if (keySystem) { const keySystemAccess = decodingInfo.keySystemAccess; if (keySystemAccess) { - if (keySystemAccess.keySystem != keySystem) { + const currentKeySystem = + keySystemsMapping[keySystemAccess.keySystem] || + keySystemAccess.keySystem; + if (currentKeySystem != keySystem) { return false; } }