| Index: media/base/key_systems.cc
|
| diff --git a/media/base/key_systems.cc b/media/base/key_systems.cc
|
| index f89992572ea6258a481fdeba97157be69993e1cf..fbff37d55dfbb64e6c22923789f854a3502f1402 100644
|
| --- a/media/base/key_systems.cc
|
| +++ b/media/base/key_systems.cc
|
| @@ -202,7 +202,7 @@ class KeySystemsImpl : public KeySystems {
|
| bool IsSupportedInitDataType(const std::string& key_system,
|
| EmeInitDataType init_data_type) const override;
|
|
|
| - bool IsSupportedCodecCombination(
|
| + EmeConfigRule GetContentTypeConfigRule(
|
| const std::string& key_system,
|
| EmeMediaType media_type,
|
| const std::string& container_mime_type,
|
| @@ -665,7 +665,7 @@ bool KeySystemsImpl::IsSupportedKeySystem(const std::string& key_system) const {
|
| return concrete_key_system_map_.count(key_system) != 0;
|
| }
|
|
|
| -bool KeySystemsImpl::IsSupportedCodecCombination(
|
| +EmeConfigRule KeySystemsImpl::GetContentTypeConfigRule(
|
| const std::string& key_system,
|
| EmeMediaType media_type,
|
| const std::string& container_mime_type,
|
| @@ -677,12 +677,12 @@ bool KeySystemsImpl::IsSupportedCodecCombination(
|
| switch (media_type) {
|
| case EmeMediaType::AUDIO:
|
| if (!StartsWithASCII(container_mime_type, "audio/", true))
|
| - return false;
|
| + return EmeConfigRule::NOT_SUPPORTED;
|
| media_type_codec_mask = audio_codec_mask_;
|
| break;
|
| case EmeMediaType::VIDEO:
|
| if (!StartsWithASCII(container_mime_type, "video/", true))
|
| - return false;
|
| + return EmeConfigRule::NOT_SUPPORTED;
|
| media_type_codec_mask = video_codec_mask_;
|
| break;
|
| }
|
| @@ -692,26 +692,43 @@ bool KeySystemsImpl::IsSupportedCodecCombination(
|
| concrete_key_system_map_.find(key_system);
|
| if (key_system_iter == concrete_key_system_map_.end()) {
|
| NOTREACHED();
|
| - return false;
|
| + return EmeConfigRule::NOT_SUPPORTED;
|
| }
|
| SupportedCodecs key_system_codec_mask =
|
| key_system_iter->second.supported_codecs;
|
| +#if defined(OS_ANDROID)
|
| + SupportedCodecs key_system_secure_codec_mask =
|
| + key_system_iter->second.supported_secure_codecs;
|
| +#endif // defined(OS_ANDROID)
|
| +
|
|
|
| // Check that the container is supported by the key system. (This check is
|
| // necessary because |codecs| may be empty.)
|
| SupportedCodecs container_codec_mask =
|
| GetCodecMaskForContainer(container_mime_type) & media_type_codec_mask;
|
| if ((key_system_codec_mask & container_codec_mask) == 0)
|
| - return false;
|
| + return EmeConfigRule::NOT_SUPPORTED;
|
|
|
| // Check that the codecs are supported by the key system and container.
|
| + EmeConfigRule support = EmeConfigRule::SUPPORTED;
|
| for (size_t i = 0; i < codecs.size(); i++) {
|
| SupportedCodecs codec = GetCodecForString(codecs[i]);
|
| if ((codec & key_system_codec_mask & container_codec_mask) == 0)
|
| - return false;
|
| + return EmeConfigRule::NOT_SUPPORTED;
|
| +#if defined(OS_ANDROID)
|
| + // Check whether the codec supports a hardware-secure mode; if not, indicate
|
| + // that hardware-secure codecs are not available for all listed codecs.
|
| + // Because the check for regular codec support is early-exit, we don't have
|
| + // to consider codecs that are only supported in hardware-secure mode. We
|
| + // could do so, and make use of SECURE_CODECS_REQUIRED, if it turns out that
|
| + // hardware-secure-only codecs actually exist and are useful.
|
| + if ((codec & key_system_secure_codec_mask) == 0)
|
| + support = EmeConfigRule::SECURE_CODECS_NOT_ALLOWED;
|
| +#endif // defined(OS_ANDROID)
|
| +
|
| }
|
|
|
| - return true;
|
| + return support;
|
| }
|
|
|
| EmeConfigRule KeySystemsImpl::GetRobustnessConfigRule(
|
| @@ -754,8 +771,8 @@ EmeConfigRule KeySystemsImpl::GetRobustnessConfigRule(
|
| return EmeConfigRule::NOT_SUPPORTED;
|
| }
|
|
|
| -#if defined(OS_CHROMEOS)
|
| if (key_system == kWidevineKeySystem) {
|
| +#if defined(OS_CHROMEOS)
|
| // Hardware security requires remote attestation.
|
| if (robustness >= EmeRobustness::HW_SECURE_CRYPTO)
|
| return EmeConfigRule::IDENTIFIER_REQUIRED;
|
| @@ -768,8 +785,11 @@ EmeConfigRule KeySystemsImpl::GetRobustnessConfigRule(
|
| max_robustness == EmeRobustness::HW_SECURE_ALL) {
|
| return EmeConfigRule::IDENTIFIER_RECOMMENDED;
|
| }
|
| - }
|
| +#elif defined(OS_ANDROID)
|
| + if (robustness > EmeRobustness::SW_SECURE_CRYPTO)
|
| + return EmeConfigRule::SECURE_CODECS_REQUIRED;
|
| #endif // defined(OS_CHROMEOS)
|
| + }
|
|
|
| return EmeConfigRule::SUPPORTED;
|
| }
|
|
|