Reviewers: halliwell, esprehn, xhwang, jrummell
CL:
https://codereview.chromium.org/2006113002/Message:
The patch would allow chromecast see correct CdmConfig::use_hw_secure_codecs on
browser side and reject robustness >= SW_SECURE_DECODE on audio platforms.
Description:
Allow hw secured codecs on chromecast
The CL will allow chromecast see robustness configs in browser process.
Audio devices will reject robustness with hardware features.
1. Add feature flag enable_hw_secure_codec, which is true on android and
chromecast.
2. use_video_overlay_for_embedded_encrypted_video = true for chromecast
video devices.
BUG=470242
TEST=Audio device reject robustness HW_SECURE_*
Base URL:
https://chromium.googlesource.com/chromium/src.git@masterAffected files (+37, -23 lines):
M chromecast/browser/cast_content_window.cc
M chromecast/browser/media/cast_browser_cdm_factory.cc
M chromecast/renderer/key_systems_cast.cc
M components/cdm/renderer/DEPS
M components/cdm/renderer/widevine_key_system_properties.h
M components/cdm/renderer/widevine_key_system_properties.cc
M content/renderer/render_frame_impl.cc
M media/BUILD.gn
M media/base/key_systems.cc
M media/media_options.gni
Index: chromecast/browser/cast_content_window.cc
diff --git a/chromecast/browser/cast_content_window.cc b/chromecast/browser/cast_content_window.cc
index cd7e7e231a4f5497b009ce2c54b86488118c4ba7..cedd78f98d76779c6e22d976d1e038b8a76a0c6a 100644
--- a/chromecast/browser/cast_content_window.cc
+++ b/chromecast/browser/cast_content_window.cc
@@ -9,10 +9,12 @@
#include "base/threading/thread_restrictions.h"
#include "chromecast/base/metrics/cast_metrics_helper.h"
#include "chromecast/browser/cast_browser_process.h"
+#include "chromecast/chromecast_features.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/common/renderer_preferences.h"
#include "ipc/ipc_message.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
@@ -113,6 +115,16 @@ std::unique_ptr<content::WebContents> CastContentWindow::CreateWebContents(
content::WebContents* web_contents = content::WebContents::Create(
create_params);
content::WebContentsObserver::Observe(web_contents);
+
+#if !BUILDFLAG(DISABLE_DISPLAY)
+ content::RendererPreferences* prefs = web_contents->GetMutableRendererPrefs();
+ prefs->use_video_overlay_for_embedded_encrypted_video = true;
+
+ content::RenderViewHost* host = web_contents->GetRenderViewHost();
+ if (host)
+ host->SyncRendererPrefs();
+#endif // !BUILDFLAG(DISABLE_DISPLAY)
+
return base::WrapUnique(web_contents);
}
Index: chromecast/browser/media/cast_browser_cdm_factory.cc
diff --git a/chromecast/browser/media/cast_browser_cdm_factory.cc b/chromecast/browser/media/cast_browser_cdm_factory.cc
index 5393e0a8c9e7e3671765c9cfcd41e16c8e879fe5..86ac18f117897fa2f9e6aea8099cad7636e3afdb 100644
--- a/chromecast/browser/media/cast_browser_cdm_factory.cc
+++ b/chromecast/browser/media/cast_browser_cdm_factory.cc
@@ -40,9 +40,6 @@ void CastBrowserCdmFactory::Create(
::media::CdmCreatedCB bound_cdm_created_cb =
::media::BindToCurrentLoop(cdm_created_cb);
- DCHECK(!cdm_config.use_hw_secure_codecs)
- << "Chromecast does not use |use_hw_secure_codecs|";
-
CastKeySystem cast_key_system(GetKeySystemByName(key_system));
scoped_refptr<chromecast::media::BrowserCdmCast> browser_cdm;
Index: chromecast/renderer/key_systems_cast.cc
diff --git a/chromecast/renderer/key_systems_cast.cc b/chromecast/renderer/key_systems_cast.cc
index 76646540e7c1c519ee8c10dfb305c8787feb0ab4..970d4e1e9b757202ec78dca4462829569eec8402 100644
--- a/chromecast/renderer/key_systems_cast.cc
+++ b/chromecast/renderer/key_systems_cast.cc
@@ -87,9 +87,7 @@ void AddChromecastKeySystems(
::media::EME_CODEC_WEBM_VP8 | ::media::EME_CODEC_WEBM_VP9;
key_systems_properties->emplace_back(new cdm::WidevineKeySystemProperties(
codecs, // Regular codecs.
-#if defined(OS_ANDROID)
codecs, // Hardware-secure codecs.
-#endif
EmeRobustness::HW_SECURE_ALL, // Max audio robustness.
EmeRobustness::HW_SECURE_ALL, // Max video robustness.
EmeSessionTypeSupport::NOT_SUPPORTED, // persistent-license.
Index: components/cdm/renderer/DEPS
diff --git a/components/cdm/renderer/DEPS b/components/cdm/renderer/DEPS
index 725e151a7a51599df3da9cefa866a26df47e9ac1..710d939a5134349b90ce7d51c525d43619cf8aad 100644
--- a/components/cdm/renderer/DEPS
+++ b/components/cdm/renderer/DEPS
@@ -1,3 +1,4 @@
include_rules = [
"+content/public/renderer",
+ "+media/media_features.h", # For flag definitions.
]
Index: components/cdm/renderer/widevine_key_system_properties.cc
diff --git a/components/cdm/renderer/widevine_key_system_properties.cc b/components/cdm/renderer/widevine_key_system_properties.cc
index 3a6eab49728cccf389de14289f54018587bc848d..836ccd064626b40e946e6248168a5b6d3ea695fc 100644
--- a/components/cdm/renderer/widevine_key_system_properties.cc
+++ b/components/cdm/renderer/widevine_key_system_properties.cc
@@ -39,9 +39,9 @@ EmeRobustness ConvertRobustness(const std::string& robustness) {
WidevineKeySystemProperties::WidevineKeySystemProperties(
media::SupportedCodecs supported_codecs,
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
media::SupportedCodecs supported_secure_codecs,
-#endif // defined(OS_ANDROID)
+#endif // BUILDFLAG(ENABLE_HW_SECURE_CODEC)
media::EmeRobustness max_audio_robustness,
media::EmeRobustness max_video_robustness,
media::EmeSessionTypeSupport persistent_license_support,
@@ -49,9 +49,9 @@ WidevineKeySystemProperties::WidevineKeySystemProperties(
media::EmeFeatureSupport persistent_state_support,
media::EmeFeatureSupport distinctive_identifier_support)
: supported_codecs_(supported_codecs),
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
supported_secure_codecs_(supported_secure_codecs),
-#endif // defined(OS_ANDROID)
+#endif // BUILDFLAG(ENABLE_HW_SECURE_CODEC)
max_audio_robustness_(max_audio_robustness),
max_video_robustness_(max_video_robustness),
persistent_license_support_(persistent_license_support),
@@ -83,11 +83,11 @@ SupportedCodecs WidevineKeySystemProperties::GetSupportedCodecs() const {
return supported_codecs_;
}
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
SupportedCodecs WidevineKeySystemProperties::GetSupportedSecureCodecs() const {
return supported_secure_codecs_;
}
-#endif
+#endif // BUILDFLAG(ENABLE_HW_SECURE_CODEC)
EmeConfigRule WidevineKeySystemProperties::GetRobustnessConfigRule(
EmeMediaType media_type,
@@ -135,7 +135,7 @@ EmeConfigRule WidevineKeySystemProperties::GetRobustnessConfigRule(
max_robustness == EmeRobustness::HW_SECURE_ALL) {
return EmeConfigRule::IDENTIFIER_RECOMMENDED;
}
-#elif defined(OS_ANDROID)
+#elif BUILDFLAG(ENABLE_HW_SECURE_CODEC)
// Require hardware secure codecs when SW_SECURE_DECODE or above is specified.
if (robustness >= EmeRobustness::SW_SECURE_DECODE) {
return EmeConfigRule::HW_SECURE_CODECS_REQUIRED;
Index: components/cdm/renderer/widevine_key_system_properties.h
diff --git a/components/cdm/renderer/widevine_key_system_properties.h b/components/cdm/renderer/widevine_key_system_properties.h
index c936c62730d09fcb1b28900eb1434ca887534bc5..d096b8645e0c43e7249cbc0080b418fdb8c531f5 100644
--- a/components/cdm/renderer/widevine_key_system_properties.h
+++ b/components/cdm/renderer/widevine_key_system_properties.h
@@ -7,6 +7,7 @@
#include "build/build_config.h"
#include "media/base/key_system_properties.h"
+#include "media/media_features.h"
namespace cdm {
@@ -15,9 +16,9 @@ class WidevineKeySystemProperties : public media::KeySystemProperties {
public:
WidevineKeySystemProperties(
media::SupportedCodecs supported_codecs,
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
media::SupportedCodecs supported_secure_codecs,
-#endif // defined(OS_ANDROID)
+#endif // BUILDFLAG(ENABLE_HW_SECURE_CODEC)
media::EmeRobustness max_audio_robustness,
media::EmeRobustness max_video_robustness,
media::EmeSessionTypeSupport persistent_license_support,
@@ -30,9 +31,9 @@ class WidevineKeySystemProperties : public media::KeySystemProperties {
media::EmeInitDataType init_data_type) const override;
media::SupportedCodecs GetSupportedCodecs() const override;
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
media::SupportedCodecs GetSupportedSecureCodecs() const override;
-#endif
+#endif // BUILDFLAG(ENABLE_HW_SECURE_CODEC)
media::EmeConfigRule GetRobustnessConfigRule(
media::EmeMediaType media_type,
@@ -50,9 +51,9 @@ class WidevineKeySystemProperties : public media::KeySystemProperties {
private:
const media::SupportedCodecs supported_codecs_;
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
const media::SupportedCodecs supported_secure_codecs_;
-#endif // defined(OS_ANDROID)
+#endif // BUILDFLAG(ENABLE_HW_SECURE_CODEC)
const media::EmeRobustness max_audio_robustness_;
const media::EmeRobustness max_video_robustness_;
const media::EmeSessionTypeSupport persistent_license_support_;
Index: content/renderer/render_frame_impl.cc
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index ed2b611bed047fcbbfaef807bb92a21c478f094b..724e11e2be3b92e8f830f2d3409d8f6af662c4ff 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -143,6 +143,7 @@
#include "media/blink/url_index.h"
#include "media/blink/webencryptedmediaclient_impl.h"
#include "media/blink/webmediaplayer_impl.h"
+#include "media/media_features.h"
#include "media/renderers/gpu_video_accelerator_factories.h"
#include "mojo/common/url_type_converters.h"
#include "mojo/edk/js/core.h"
@@ -6033,7 +6034,7 @@ shell::mojom::InterfaceProvider* RenderFrameImpl::GetMediaInterfaceProvider() {
#endif // defined(ENABLE_MOJO_MEDIA)
bool RenderFrameImpl::AreSecureCodecsSupported() {
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
// Hardware-secure codecs are only supported if secure surfaces are enabled.
return render_view_->renderer_preferences_
.use_video_overlay_for_embedded_encrypted_video;
Index: media/BUILD.gn
diff --git a/media/BUILD.gn b/media/BUILD.gn
index ccbb090fc95a32de28cf0a807fd854e73bc3cb41..4df830af4cde99594096612849be6334a8faf0af 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -20,6 +20,7 @@ buildflag_header("media_features") {
"ENABLE_HEVC_DEMUXING=$enable_hevc_demuxing",
"ENABLE_MSE_MPEG2TS_STREAM_PARSER=$enable_mse_mpeg2ts_stream_parser",
"ENABLE_MP4_VP9_DEMUXING=0",
+ "ENABLE_HW_SECURE_CODEC=$enable_hw_secure_codec",
]
}
Index: media/base/key_systems.cc
diff --git a/media/base/key_systems.cc b/media/base/key_systems.cc
index fab743252d9f227af048d2fae5b6f52c493b4548..e5b4376f2b2b5ea589e76cc3c399e04eafd7c1e1 100644
--- a/media/base/key_systems.cc
+++ b/media/base/key_systems.cc
@@ -588,10 +588,10 @@ EmeConfigRule KeySystemsImpl::GetContentTypeConfigRule(
SupportedCodecs key_system_codec_mask =
key_system_iter->second->GetSupportedCodecs();
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
SupportedCodecs key_system_secure_codec_mask =
key_system_iter->second->GetSupportedSecureCodecs();
-#endif // defined(OS_ANDROID)
+#endif // BUILDFLAG(ENABLE_HW_SECURE_CODEC)
// Check that the container is supported by the key system. (This check is
// necessary because |codecs| may be empty.)
@@ -606,7 +606,7 @@ EmeConfigRule KeySystemsImpl::GetContentTypeConfigRule(
SupportedCodecs codec = GetCodecForString(codecs[i]);
if ((codec & key_system_codec_mask & mime_type_codec_mask) == 0)
return EmeConfigRule::NOT_SUPPORTED;
-#if defined(OS_ANDROID)
+#if BUILDFLAG(ENABLE_HW_SECURE_CODEC)
// Check whether the codec supports a hardware-secure mode. The goal is to
// prevent mixing of non-hardware-secure codecs with hardware-secure codecs,
// since the mode is fixed at CDM creation.
@@ -617,7 +617,7 @@ EmeConfigRule KeySystemsImpl::GetContentTypeConfigRule(
// that hardware-secure-only codecs actually exist and are useful.
if ((codec & key_system_secure_codec_mask) == 0)
support = EmeConfigRule::HW_SECURE_CODECS_NOT_ALLOWED;
-#endif // defined(OS_ANDROID)
+#endif // BUILDFLAG(ENABLE_HW_SECURE_CODEC)
}
return support;
Index: media/media_options.gni
diff --git a/media/media_options.gni b/media/media_options.gni
index 21d31d0ee947dbf6b8b5d7da1019b1fd8acb5be8..df20ef8da4823abf0a5c44b1e7389c9861ee5057 100644
--- a/media/media_options.gni
+++ b/media/media_options.gni
@@ -42,6 +42,9 @@ declare_args() {
# Enable HEVC/H265 demuxing. Actual decoding must be provided by the
# platform. Enable by default for Chromecast.
enable_hevc_demuxing = proprietary_codecs && is_chromecast
+
+ # Allow supporting of hardware secured codecs.
+ enable_hw_secure_codec = is_android || is_chromecast
}
# Use a second declare_args() to pick up possible overrides of |use_cras|.