blob: 5efc9ed630674312dfdc6b1809a1ffc677e06ffc [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/cdm/renderer/external_clear_key_key_system_info.h"
#include <algorithm>
#include "base/containers/contains.h"
#include "base/notreached.h"
#include "media/base/eme_constants.h"
#include "media/base/key_system_names.h"
#include "media/cdm/clear_key_cdm_common.h"
namespace cdm {
ExternalClearKeyKeySystemInfo::ExternalClearKeyKeySystemInfo()
: ExternalClearKeyKeySystemInfo(
// Supports kExternalClearKeyKeySystem and all its sub key systems,
// except for the explicitly "invalid" one. See the test
// EncryptedMediaSupportedTypesExternalClearKeyTest.InvalidKeySystems.
media::kExternalClearKeyKeySystem,
// Excludes kMediaFoundationClearKeyKeySystem to treat MediaFoundation
// Clear Key key system as a separate one.
{media::kExternalClearKeyInvalidKeySystem,
#if BUILDFLAG(IS_WIN)
media::kMediaFoundationClearKeyKeySystem
#endif // BUILDFLAG(IS_WIN)
},
media::EME_CODEC_MP4_ALL | media::EME_CODEC_WEBM_ALL,
std::nullopt,
media::EmeFeatureSupport::REQUESTABLE,
media::EmeFeatureSupport::NOT_SUPPORTED) {
}
ExternalClearKeyKeySystemInfo::ExternalClearKeyKeySystemInfo(
const std::string& key_system,
std::vector<std::string> excluded_key_systems,
media::SupportedCodecs codecs,
media::EmeConfig::Rule eme_config_rule,
media::EmeFeatureSupport persistent_state_support,
media::EmeFeatureSupport distinctive_identifier_support)
: key_system_(key_system),
excluded_key_systems_(excluded_key_systems),
codecs_(codecs),
eme_config_rule_(eme_config_rule),
persistent_state_support_(persistent_state_support),
distinctive_identifier_support_(distinctive_identifier_support) {}
ExternalClearKeyKeySystemInfo::~ExternalClearKeyKeySystemInfo() = default;
std::string ExternalClearKeyKeySystemInfo::GetBaseKeySystemName() const {
return key_system_;
}
bool ExternalClearKeyKeySystemInfo::IsSupportedKeySystem(
const std::string& key_system) const {
return (key_system == key_system_ ||
media::IsSubKeySystemOf(key_system, key_system_)) &&
!base::Contains(excluded_key_systems_, key_system);
}
bool ExternalClearKeyKeySystemInfo::IsSupportedInitDataType(
media::EmeInitDataType init_data_type) const {
switch (init_data_type) {
case media::EmeInitDataType::CENC:
case media::EmeInitDataType::WEBM:
case media::EmeInitDataType::KEYIDS:
return true;
case media::EmeInitDataType::UNKNOWN:
return false;
}
NOTREACHED();
}
std::optional<media::EmeConfig>
ExternalClearKeyKeySystemInfo::GetEncryptionSchemeConfigRule(
media::EncryptionScheme encryption_scheme) const {
switch (encryption_scheme) {
case media::EncryptionScheme::kCenc:
case media::EncryptionScheme::kCbcs:
return media::EmeConfig::SupportedRule();
case media::EncryptionScheme::kUnencrypted:
break;
}
NOTREACHED();
}
media::SupportedCodecs ExternalClearKeyKeySystemInfo::GetSupportedCodecs()
const {
return codecs_;
}
// On Windows, MediaFoundation Clear Key CDM requires HW secure codecs. We
// need this method to pretent to require this for testing purposes.
media::SupportedCodecs
ExternalClearKeyKeySystemInfo::GetSupportedHwSecureCodecs() const {
return codecs_;
}
std::optional<media::EmeConfig>
ExternalClearKeyKeySystemInfo::GetRobustnessConfigRule(
const std::string& key_system,
media::EmeMediaType media_type,
const std::string& requested_robustness,
const bool* /*hw_secure_requirement*/) const {
if (eme_config_rule_.has_value()) {
return eme_config_rule_;
}
if (requested_robustness.empty()) {
return media::EmeConfig::SupportedRule();
} else {
return media::EmeConfig::UnsupportedRule();
}
}
// Persistent license sessions are faked.
std::optional<media::EmeConfig>
ExternalClearKeyKeySystemInfo::GetPersistentLicenseSessionSupport() const {
return media::EmeConfig::SupportedRule();
}
media::EmeFeatureSupport
ExternalClearKeyKeySystemInfo::GetPersistentStateSupport() const {
return persistent_state_support_;
}
media::EmeFeatureSupport
ExternalClearKeyKeySystemInfo::GetDistinctiveIdentifierSupport() const {
return distinctive_identifier_support_;
}
} // namespace cdm