| Index: media/blink/key_system_config_selector.cc
|
| diff --git a/media/blink/key_system_config_selector.cc b/media/blink/key_system_config_selector.cc
|
| index 67a13e26ec0ab363d2b528dab09ead9a4ef51bd0..324a28f6cec6f9c5612ba26d68b6a321e28cac03 100644
|
| --- a/media/blink/key_system_config_selector.cc
|
| +++ b/media/blink/key_system_config_selector.cc
|
| @@ -177,6 +177,12 @@ class KeySystemConfigSelector::ConfigState {
|
| case EmeConfigRule::IDENTIFIER_AND_PERSISTENCE_REQUIRED:
|
| return (!is_identifier_not_allowed_ && IsPermissionPossible() &&
|
| !is_persistence_not_allowed_);
|
| +#if defined(OS_ANDROID)
|
| + case EmeConfigRule::SECURE_CODECS_NOT_ALLOWED:
|
| + return !are_secure_codecs_required_;
|
| + case EmeConfigRule::SECURE_CODECS_REQUIRED:
|
| + return !are_secure_codecs_not_allowed_;
|
| +#endif // defined(OS_ANDROID)
|
| case EmeConfigRule::SUPPORTED:
|
| return true;
|
| }
|
| @@ -210,6 +216,14 @@ class KeySystemConfigSelector::ConfigState {
|
| is_identifier_required_ = true;
|
| is_persistence_required_ = true;
|
| return;
|
| +#if defined(OS_ANDROID)
|
| + case EmeConfigRule::SECURE_CODECS_NOT_ALLOWED:
|
| + are_secure_codecs_not_allowed_ = true;
|
| + return;
|
| + case EmeConfigRule::SECURE_CODECS_REQUIRED:
|
| + are_secure_codecs_required_ = true;
|
| + return;
|
| +#endif // defined(OS_ANDROID)
|
| case EmeConfigRule::SUPPORTED:
|
| return;
|
| }
|
| @@ -219,10 +233,12 @@ class KeySystemConfigSelector::ConfigState {
|
| private:
|
| // Whether permission to use a distinctive identifier was requested. If set,
|
| // |is_permission_granted_| represents the final decision.
|
| - const bool was_permission_requested_;
|
| + // (Not changed by adding rules.)
|
| + bool was_permission_requested_;
|
|
|
| // Whether permission to use a distinctive identifier has been granted.
|
| - const bool is_permission_granted_;
|
| + // (Not changed by adding rules.)
|
| + bool is_permission_granted_;
|
|
|
| // Whether a rule has been added that requires or blocks a distinctive
|
| // identifier.
|
| @@ -236,7 +252,11 @@ class KeySystemConfigSelector::ConfigState {
|
| bool is_persistence_required_ = false;
|
| bool is_persistence_not_allowed_ = false;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(ConfigState);
|
| +#if defined(OS_ANDROID)
|
| + // Whether a rule has been added that requires or blocks secure codecs.
|
| + bool are_secure_codecs_required_ = false;
|
| + bool are_secure_codecs_not_allowed_ = false;
|
| +#endif // defined(OS_ANDROID)
|
| };
|
|
|
| KeySystemConfigSelector::KeySystemConfigSelector(
|
| @@ -256,38 +276,40 @@ bool KeySystemConfigSelector::IsSupportedContentType(
|
| const std::string& key_system,
|
| EmeMediaType media_type,
|
| const std::string& container_mime_type,
|
| - const std::string& codecs) {
|
| + const std::string& codecs,
|
| + KeySystemConfigSelector::ConfigState* config_state) {
|
| // TODO(sandersd): Move contentType parsing from Blink to here so that invalid
|
| // parameters can be rejected. http://crbug.com/417561
|
| std::string container_lower = base::StringToLowerASCII(container_mime_type);
|
|
|
| - // Check that |container_mime_type| and |codecs| are supported by the CDM.
|
| - // This check does not handle extended codecs, so extended codec information
|
| - // is stripped.
|
| - std::vector<std::string> codec_vector;
|
| - net::ParseCodecString(codecs, &codec_vector, true);
|
| - if (!key_systems_->IsSupportedCodecCombination(
|
| - key_system, media_type, container_lower, codec_vector)) {
|
| - return false;
|
| - }
|
| -
|
| - // Check that |container_mime_type| is supported by Chrome. This can only
|
| - // happen if the CDM declares support for a container that Chrome does not.
|
| - if (!net::IsSupportedMediaMimeType(container_lower)) {
|
| - NOTREACHED();
|
| + // Check that |container_mime_type| is supported by Chrome.
|
| + if (!net::IsSupportedMediaMimeType(container_lower))
|
| return false;
|
| - }
|
|
|
| // Check that |codecs| are supported by Chrome. This is done primarily to
|
| // validate extended codecs, but it also ensures that the CDM cannot support
|
| // codecs that Chrome does not (which could complicate the robustness
|
| // algorithm).
|
| - if (codec_vector.empty())
|
| - return true;
|
| - codec_vector.clear();
|
| + std::vector<std::string> codec_vector;
|
| net::ParseCodecString(codecs, &codec_vector, false);
|
| - return (net::IsSupportedStrictMediaMimeType(container_lower, codec_vector) ==
|
| - net::IsSupported);
|
| + if (!codec_vector.empty() &&
|
| + (net::IsSupportedStrictMediaMimeType(container_lower, codec_vector) !=
|
| + net::IsSupported)) {
|
| + return false;
|
| + }
|
| +
|
| + // Check that |container_mime_type| and |codecs| are supported by the CDM.
|
| + // This check does not handle extended codecs, so extended codec information
|
| + // is stripped (extended codec information was checked above).
|
| + std::vector<std::string> stripped_codec_vector;
|
| + net::ParseCodecString(codecs, &stripped_codec_vector, true);
|
| + EmeConfigRule codecs_rule = key_systems_->GetContentTypeConfigRule(
|
| + key_system, media_type, container_lower, stripped_codec_vector);
|
| + if (!config_state->IsRuleSupported(codecs_rule))
|
| + return false;
|
| + config_state->AddRule(codecs_rule);
|
| +
|
| + return true;
|
| }
|
|
|
| bool KeySystemConfigSelector::GetSupportedCapabilities(
|
| @@ -318,12 +340,15 @@ bool KeySystemConfigSelector::GetSupportedCapabilities(
|
| << "a capability contentType was empty.";
|
| return false;
|
| }
|
| +
|
| // 3.4-3.11. (Implemented by IsSupportedContentType().)
|
| + ConfigState proposed_config_state = *config_state;
|
| if (!base::IsStringASCII(capability.mimeType) ||
|
| !base::IsStringASCII(capability.codecs) ||
|
| !IsSupportedContentType(key_system, media_type,
|
| base::UTF16ToASCII(capability.mimeType),
|
| - base::UTF16ToASCII(capability.codecs))) {
|
| + base::UTF16ToASCII(capability.codecs),
|
| + &proposed_config_state)) {
|
| continue;
|
| }
|
| // 3.12. If robustness is not the empty string, run the following steps:
|
| @@ -335,9 +360,9 @@ bool KeySystemConfigSelector::GetSupportedCapabilities(
|
| continue;
|
| EmeConfigRule robustness_rule = key_systems_->GetRobustnessConfigRule(
|
| key_system, media_type, base::UTF16ToASCII(capability.robustness));
|
| - if (!config_state->IsRuleSupported(robustness_rule))
|
| + if (!proposed_config_state.IsRuleSupported(robustness_rule))
|
| continue;
|
| - config_state->AddRule(robustness_rule);
|
| + proposed_config_state.AddRule(robustness_rule);
|
| // 3.12.2. Add robustness to configuration.
|
| // (It's already added, we use capability as configuration.)
|
| }
|
| @@ -345,11 +370,11 @@ bool KeySystemConfigSelector::GetSupportedCapabilities(
|
| // encrypted media data as specified by configuration, including all
|
| // media types, in combination with local accumulated capabilities,
|
| // continue to the next iteration.
|
| - // (This is handled when adding rules to |config_state|.)
|
| + // (This is handled when adding rules to |proposed_config_state|.)
|
| // 3.14. Add configuration to supported media capabilities.
|
| supported_media_capabilities->push_back(capability);
|
| // 3.15. Add configuration to local accumulated capabilities.
|
| - // (Skipped as we directly update |config_state|.)
|
| + *config_state = proposed_config_state;
|
| }
|
| // 4. If supported media capabilities is empty, return null.
|
| if (supported_media_capabilities->empty()) {
|
| @@ -367,6 +392,7 @@ KeySystemConfigSelector::GetSupportedConfiguration(
|
| const blink::WebMediaKeySystemConfiguration& candidate,
|
| ConfigState* config_state,
|
| blink::WebMediaKeySystemConfiguration* accumulated_configuration) {
|
| + // TODO(sandersd): Set state of SECURE_CODECS from renderer pref.
|
| // From https://w3c.github.io/encrypted-media/#get-supported-configuration
|
| // 1. Let accumulated configuration be empty. (Done by caller.)
|
| // 2. If the initDataTypes member is present in candidate configuration, run
|
|
|