summaryrefslogtreecommitdiffstats
path: root/dom/media/eme/MediaKeySystemAccess.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/eme/MediaKeySystemAccess.cpp')
-rw-r--r--dom/media/eme/MediaKeySystemAccess.cpp85
1 files changed, 57 insertions, 28 deletions
diff --git a/dom/media/eme/MediaKeySystemAccess.cpp b/dom/media/eme/MediaKeySystemAccess.cpp
index b58ff76424..d498c2a773 100644
--- a/dom/media/eme/MediaKeySystemAccess.cpp
+++ b/dom/media/eme/MediaKeySystemAccess.cpp
@@ -214,6 +214,9 @@ static KeySystemConfig::EMECodecString ToEMEAPICodecString(
if (IsH264CodecString(aCodec)) {
return KeySystemConfig::EME_CODEC_H264;
}
+ if (IsAV1CodecString(aCodec)) {
+ return KeySystemConfig::EME_CODEC_AV1;
+ }
if (IsVP8CodecString(aCodec)) {
return KeySystemConfig::EME_CODEC_VP8;
}
@@ -228,31 +231,53 @@ static KeySystemConfig::EMECodecString ToEMEAPICodecString(
return ""_ns;
}
-static nsTArray<KeySystemConfig> GetSupportedKeySystems() {
+static nsTArray<KeySystemConfig> GetSupportedKeySystems(
+ const nsAString& aKeySystem, bool aIsHardwareDecryption) {
+ using DecryptionInfo = KeySystemConfig::DecryptionInfo;
nsTArray<KeySystemConfig> keySystemConfigs;
-
- const nsTArray<nsString> keySystemNames{
- NS_ConvertUTF8toUTF16(kClearKeyKeySystemName),
- NS_ConvertUTF8toUTF16(kWidevineKeySystemName),
+ if (IsWidevineKeySystem(aKeySystem) || IsClearkeyKeySystem(aKeySystem)) {
+ Unused << KeySystemConfig::CreateKeySystemConfigs(
+ aKeySystem, DecryptionInfo::Software, keySystemConfigs);
+ }
#ifdef MOZ_WMF_CDM
- NS_ConvertUTF8toUTF16(kPlayReadyKeySystemName),
- NS_ConvertUTF8toUTF16(kPlayReadyKeySystemHardware),
- NS_ConvertUTF8toUTF16(kPlayReadyHardwareClearLeadKeySystemName),
- NS_ConvertUTF8toUTF16(kWidevineExperimentKeySystemName),
- NS_ConvertUTF8toUTF16(kWidevineExperiment2KeySystemName),
-#endif
- };
- for (const auto& name : keySystemNames) {
- Unused << KeySystemConfig::CreateKeySystemConfigs(name, keySystemConfigs);
+ if (IsPlayReadyKeySystem(aKeySystem)) {
+ Unused << KeySystemConfig::CreateKeySystemConfigs(
+ NS_ConvertUTF8toUTF16(kPlayReadyKeySystemName),
+ DecryptionInfo::Software, keySystemConfigs);
+ if (aIsHardwareDecryption) {
+ Unused << KeySystemConfig::CreateKeySystemConfigs(
+ NS_ConvertUTF8toUTF16(kPlayReadyKeySystemName),
+ DecryptionInfo::Hardware, keySystemConfigs);
+ Unused << KeySystemConfig::CreateKeySystemConfigs(
+ NS_ConvertUTF8toUTF16(kPlayReadyKeySystemHardware),
+ DecryptionInfo::Hardware, keySystemConfigs);
+ Unused << KeySystemConfig::CreateKeySystemConfigs(
+ NS_ConvertUTF8toUTF16(kPlayReadyHardwareClearLeadKeySystemName),
+ DecryptionInfo::Hardware, keySystemConfigs);
+ }
+ }
+ // If key system is kWidevineKeySystemName but with hardware decryption
+ // requirement, then we need to check those experiement key systems which are
+ // used for hardware decryption.
+ if (IsWidevineExperimentKeySystem(aKeySystem) ||
+ (IsWidevineKeySystem(aKeySystem) && aIsHardwareDecryption)) {
+ Unused << KeySystemConfig::CreateKeySystemConfigs(
+ NS_ConvertUTF8toUTF16(kWidevineExperimentKeySystemName),
+ DecryptionInfo::Hardware, keySystemConfigs);
+ Unused << KeySystemConfig::CreateKeySystemConfigs(
+ NS_ConvertUTF8toUTF16(kWidevineExperiment2KeySystemName),
+ DecryptionInfo::Hardware, keySystemConfigs);
}
+#endif
return keySystemConfigs;
}
static bool GetKeySystemConfigs(
- const nsAString& aKeySystem,
+ const nsAString& aKeySystem, bool aIsHardwareDecryption,
nsTArray<KeySystemConfig>& aOutKeySystemConfig) {
bool foundConfigs = false;
- for (auto& config : GetSupportedKeySystems()) {
+ for (auto& config :
+ GetSupportedKeySystems(aKeySystem, aIsHardwareDecryption)) {
if (config.IsSameKeySystem(aKeySystem)) {
aOutKeySystemConfig.AppendElement(std::move(config));
foundConfigs = true;
@@ -263,9 +288,10 @@ static bool GetKeySystemConfigs(
/* static */
bool MediaKeySystemAccess::KeySystemSupportsInitDataType(
- const nsAString& aKeySystem, const nsAString& aInitDataType) {
+ const nsAString& aKeySystem, const nsAString& aInitDataType,
+ bool aIsHardwareDecryption) {
nsTArray<KeySystemConfig> implementations;
- GetKeySystemConfigs(aKeySystem, implementations);
+ GetKeySystemConfigs(aKeySystem, aIsHardwareDecryption, implementations);
bool containInitType = false;
for (const auto& config : implementations) {
if (config.mInitDataTypes.Contains(aInitDataType)) {
@@ -352,15 +378,13 @@ static bool SupportsEncryptionScheme(
static bool ToSessionType(const nsAString& aSessionType,
MediaKeySessionType& aOutType) {
- if (aSessionType.Equals(ToString(MediaKeySessionType::Temporary))) {
- aOutType = MediaKeySessionType::Temporary;
- return true;
- }
- if (aSessionType.Equals(ToString(MediaKeySessionType::Persistent_license))) {
- aOutType = MediaKeySessionType::Persistent_license;
- return true;
+ Maybe<MediaKeySessionType> type =
+ StringToEnum<MediaKeySessionType>(aSessionType);
+ if (type.isNothing()) {
+ return false;
}
- return false;
+ aOutType = type.value();
+ return true;
}
// 5.1.1 Is persistent session type?
@@ -395,6 +419,7 @@ static CodecType GetCodecType(const KeySystemConfig::EMECodecString& aCodec) {
return Audio;
}
if (aCodec.Equals(KeySystemConfig::EME_CODEC_H264) ||
+ aCodec.Equals(KeySystemConfig::EME_CODEC_AV1) ||
aCodec.Equals(KeySystemConfig::EME_CODEC_VP8) ||
aCodec.Equals(KeySystemConfig::EME_CODEC_VP9) ||
aCodec.Equals(KeySystemConfig::EME_CODEC_HEVC)) {
@@ -1040,7 +1065,11 @@ bool MediaKeySystemAccess::GetSupportedConfig(
DecoderDoctorDiagnostics* aDiagnostics, bool aIsPrivateBrowsing,
const std::function<void(const char*)>& aDeprecationLogFn) {
nsTArray<KeySystemConfig> implementations;
- if (!GetKeySystemConfigs(aKeySystem, implementations)) {
+ const bool isHardwareDecryptionRequest =
+ CheckIfHarewareDRMConfigExists(aConfigs) ||
+ DoesKeySystemSupportHardwareDecryption(aKeySystem);
+ if (!GetKeySystemConfigs(aKeySystem, isHardwareDecryptionRequest,
+ implementations)) {
return false;
}
for (const auto& implementation : implementations) {
@@ -1082,7 +1111,7 @@ static nsCString ToCString(const nsString& aString) {
static nsCString ToCString(const MediaKeysRequirement aValue) {
nsCString str("'");
- str.AppendASCII(MediaKeysRequirementValues::GetString(aValue));
+ str.AppendASCII(GetEnumString(aValue));
str.AppendLiteral("'");
return str;
}