diff options
-rw-r--r-- | android_webview/lib/main/aw_main_delegate.cc | 5 | ||||
-rw-r--r-- | android_webview/renderer/aw_key_systems.cc | 6 | ||||
-rw-r--r-- | chrome/browser/about_flags.cc | 7 | ||||
-rw-r--r-- | chrome/renderer/media/chrome_key_systems.cc | 6 | ||||
-rw-r--r-- | chromecast/browser/cast_browser_main_parts.cc | 8 | ||||
-rw-r--r-- | chromecast/browser/media/cast_browser_cdm_factory.cc | 5 | ||||
-rw-r--r-- | chromecast/browser/media/cast_browser_cdm_factory.h | 7 | ||||
-rw-r--r-- | chromecast/chromecast.gyp | 2 | ||||
-rw-r--r-- | components/cdm/renderer/android_key_systems.cc | 13 | ||||
-rw-r--r-- | components/cdm/renderer/android_key_systems.h | 7 | ||||
-rw-r--r-- | content/browser/media/cdm/browser_cdm_manager.cc | 21 | ||||
-rw-r--r-- | content/browser/renderer_host/render_process_host_impl.cc | 1 | ||||
-rw-r--r-- | media/base/android/browser_cdm_factory_android.cc | 18 | ||||
-rw-r--r-- | media/base/android/browser_cdm_factory_android.h | 1 | ||||
-rw-r--r-- | media/base/browser_cdm_factory.cc | 5 | ||||
-rw-r--r-- | media/base/browser_cdm_factory.h | 4 | ||||
-rw-r--r-- | media/base/media_switches.cc | 4 | ||||
-rw-r--r-- | media/base/media_switches.h | 1 |
18 files changed, 72 insertions, 49 deletions
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc index 1377618..27e5da9 100644 --- a/android_webview/lib/main/aw_main_delegate.cc +++ b/android_webview/lib/main/aw_main_delegate.cc @@ -77,11 +77,8 @@ bool AwMainDelegate::BasicStartupComplete(int* exit_code) { // Web Notification API and the Push API are not supported (crbug.com/434712) cl->AppendSwitch(switches::kDisableNotifications); -#if defined(VIDEO_HOLE) - // Support EME with hole-punching. For example, Widevine L1. - cl->AppendSwitch(switches::kMediaDrmEnableNonCompositing); + // TODO(ddorwin): Enable unprefixed EME. See http://crbug.com/394931. cl->AppendSwitch(switches::kDisableEncryptedMedia); -#endif // WebRTC hardware decoding is not supported, internal bug 15075307 cl->AppendSwitch(switches::kDisableWebRtcHWDecoding); diff --git a/android_webview/renderer/aw_key_systems.cc b/android_webview/renderer/aw_key_systems.cc index cc3059e..29e50ce 100644 --- a/android_webview/renderer/aw_key_systems.cc +++ b/android_webview/renderer/aw_key_systems.cc @@ -9,7 +9,11 @@ namespace android_webview { void AwAddKeySystems( std::vector<media::KeySystemInfo>* key_systems_info) { - cdm::AddAndroidWidevine(key_systems_info); + // TODO(sandersd): Non-compositing support depends on the + // use_video_overlay_for_embedded_encrypted_video pref, which may differ per + // WebContents. For now, err on the side of registering support. + // http://crbug.com/467779 + cdm::AddAndroidWidevine(key_systems_info, true); cdm::AddAndroidPlatformKeySystems(key_systems_info); } diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index aaade44..9b737b8 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc @@ -728,13 +728,6 @@ const Experiment kExperiments[] = { kOsAndroid, SINGLE_VALUE_TYPE(switches::kDisableInfobarForProtectedMediaIdentifier) }, - { - "mediadrm-enable-non-compositing", - IDS_FLAGS_MEDIADRM_ENABLE_NON_COMPOSITING_NAME, - IDS_FLAGS_MEDIADRM_ENABLE_NON_COMPOSITING_DESCRIPTION, - kOsAndroid, - SINGLE_VALUE_TYPE(switches::kMediaDrmEnableNonCompositing) - }, #endif // defined(OS_ANDROID) { "disable-javascript-harmony-shipping", diff --git a/chrome/renderer/media/chrome_key_systems.cc b/chrome/renderer/media/chrome_key_systems.cc index e80e71b..63d4734 100644 --- a/chrome/renderer/media/chrome_key_systems.cc +++ b/chrome/renderer/media/chrome_key_systems.cc @@ -223,6 +223,10 @@ void AddChromeKeySystems(std::vector<KeySystemInfo>* key_systems_info) { #endif // defined(ENABLE_PEPPER_CDMS) #if defined(OS_ANDROID) - cdm::AddAndroidWidevine(key_systems_info); + // TODO(sandersd): Non-compositing support depends on the + // use_video_overlay_for_embedded_encrypted_video pref, which may differ per + // WebContents. For now, Chromium does not support them. + // http://crbug.com/467779 + cdm::AddAndroidWidevine(key_systems_info, false); #endif // defined(OS_ANDROID) } diff --git a/chromecast/browser/cast_browser_main_parts.cc b/chromecast/browser/cast_browser_main_parts.cc index 6ed8a8d..cdaaf0b 100644 --- a/chromecast/browser/cast_browser_main_parts.cc +++ b/chromecast/browser/cast_browser_main_parts.cc @@ -22,7 +22,6 @@ #include "chromecast/browser/cast_browser_context.h" #include "chromecast/browser/cast_browser_process.h" #include "chromecast/browser/devtools/remote_debugging_server.h" -#include "chromecast/browser/media/cast_browser_cdm_factory.h" #include "chromecast/browser/metrics/cast_metrics_prefs.h" #include "chromecast/browser/metrics/cast_metrics_service_client.h" #include "chromecast/browser/pref_service_helper.h" @@ -40,6 +39,8 @@ #include "chromecast/crash/android/crash_handler.h" #include "components/crash/browser/crash_dump_manager_android.h" #include "net/android/network_change_notifier_factory_android.h" +#else +#include "chromecast/browser/media/cast_browser_cdm_factory.h" #endif #if defined(USE_AURA) @@ -146,14 +147,11 @@ struct DefaultCommandLineSwitch { }; DefaultCommandLineSwitch g_default_switches[] = { - // TODO(ddorwin): Develop a permanent solution. See http://crbug.com/394926. - // For now, disable unprefixed EME because the video behavior not be - // consistent with other clients. + // TODO(gunsch): Enable unprefixed EME. See http://crbug.com/471936. { switches::kDisableEncryptedMedia, ""}, #if defined(OS_ANDROID) // Disables Chromecast-specific WiFi-related features on ATV for now. { switches::kNoWifi, "" }, - { switches::kMediaDrmEnableNonCompositing, ""}, { switches::kEnableOverlayFullscreenVideo, ""}, { switches::kDisableInfobarForProtectedMediaIdentifier, ""}, { switches::kDisableGestureRequirementForMediaPlayback, ""}, diff --git a/chromecast/browser/media/cast_browser_cdm_factory.cc b/chromecast/browser/media/cast_browser_cdm_factory.cc index 123473c..ef41155 100644 --- a/chromecast/browser/media/cast_browser_cdm_factory.cc +++ b/chromecast/browser/media/cast_browser_cdm_factory.cc @@ -13,13 +13,16 @@ namespace chromecast { namespace media { -scoped_ptr< ::media::BrowserCdm> CastBrowserCdmFactory::CreateBrowserCdm( +scoped_ptr<::media::BrowserCdm> CastBrowserCdmFactory::CreateBrowserCdm( const std::string& key_system_name, + bool use_secure_surface, const ::media::SessionMessageCB& session_message_cb, const ::media::SessionClosedCB& session_closed_cb, const ::media::SessionErrorCB& session_error_cb, const ::media::SessionKeysChangeCB& session_keys_change_cb, const ::media::SessionExpirationUpdateCB& session_expiration_update_cb) { + DCHECK(!use_secure_surface) << "Chromecast does not use |use_secure_surface|"; + CastKeySystem key_system(GetKeySystemByName(key_system_name)); scoped_ptr<chromecast::media::BrowserCdmCast> browser_cdm; diff --git a/chromecast/browser/media/cast_browser_cdm_factory.h b/chromecast/browser/media/cast_browser_cdm_factory.h index 03f4530..dc72919 100644 --- a/chromecast/browser/media/cast_browser_cdm_factory.h +++ b/chromecast/browser/media/cast_browser_cdm_factory.h @@ -20,14 +20,15 @@ class CastBrowserCdmFactory : public ::media::BrowserCdmFactory { ~CastBrowserCdmFactory() override {}; // ::media::BrowserCdmFactory implementation: - scoped_ptr< ::media::BrowserCdm> CreateBrowserCdm( + scoped_ptr<::media::BrowserCdm> CreateBrowserCdm( const std::string& key_system, + bool use_secure_surface, const ::media::SessionMessageCB& session_message_cb, const ::media::SessionClosedCB& session_closed_cb, const ::media::SessionErrorCB& session_error_cb, const ::media::SessionKeysChangeCB& session_keys_change_cb, - const ::media::SessionExpirationUpdateCB& - session_expiration_update_cb) override; + const ::media::SessionExpirationUpdateCB& session_expiration_update_cb) + override; private: DISALLOW_COPY_AND_ASSIGN(CastBrowserCdmFactory); diff --git a/chromecast/chromecast.gyp b/chromecast/chromecast.gyp index 7702c10..b4ef622 100644 --- a/chromecast/chromecast.gyp +++ b/chromecast/chromecast.gyp @@ -280,7 +280,6 @@ 'browser/cast_content_browser_client_simple.cc', 'browser/cast_network_delegate_simple.cc', 'browser/devtools/remote_debugging_server_simple.cc', - 'browser/media/cast_browser_cdm_factory_simple.cc', 'browser/metrics/platform_metrics_providers_simple.cc', 'browser/pref_service_helper_simple.cc', 'common/platform_client_auth_simple.cc', @@ -295,6 +294,7 @@ ], }, { 'sources': [ + 'browser/media/cast_browser_cdm_factory_simple.cc', 'browser/service/cast_service_simple.cc', 'browser/service/cast_service_simple.h', ], diff --git a/components/cdm/renderer/android_key_systems.cc b/components/cdm/renderer/android_key_systems.cc index d9bb106..e1538ba 100644 --- a/components/cdm/renderer/android_key_systems.cc +++ b/components/cdm/renderer/android_key_systems.cc @@ -39,21 +39,22 @@ static SupportedKeySystemResponse QueryKeySystemSupport( return response; } -void AddAndroidWidevine(std::vector<KeySystemInfo>* concrete_key_systems) { +void AddAndroidWidevine(std::vector<KeySystemInfo>* concrete_key_systems, + bool is_non_compositing_supported) { SupportedKeySystemResponse response = QueryKeySystemSupport( kWidevineKeySystem); // When creating the WIDEVINE key system, BrowserCdmFactoryAndroid configures - // the CDM's security level based on the --mediadrm-enable-non-compositing - // flag (L1 if the flag is enabled, L3 otherwise). Therefore the supported - // codec/robustenss combinations depend on that flag. + // the CDM's security level based on a pref. Therefore the supported + // codec/robustenss combinations depend on that pref, represented by + // |bool is_non_compositing_supported|. // TODO(sandersd): For unprefixed, set the security level based on the // requested robustness instead of the flag. http://crbug.com/467779 + // We should also stop using the term "non_compositing." SupportedCodecs codecs = response.compositing_codecs; EmeRobustness max_audio_robustness = EmeRobustness::SW_SECURE_CRYPTO; EmeRobustness max_video_robustness = EmeRobustness::SW_SECURE_CRYPTO; - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kMediaDrmEnableNonCompositing)) { + if (is_non_compositing_supported) { codecs = response.non_compositing_codecs; max_audio_robustness = EmeRobustness::HW_SECURE_CRYPTO; max_video_robustness = EmeRobustness::HW_SECURE_ALL; diff --git a/components/cdm/renderer/android_key_systems.h b/components/cdm/renderer/android_key_systems.h index fb962b1..b27f57c 100644 --- a/components/cdm/renderer/android_key_systems.h +++ b/components/cdm/renderer/android_key_systems.h @@ -12,7 +12,12 @@ namespace cdm { void AddAndroidWidevine( - std::vector<media::KeySystemInfo>* concrete_key_systems); + std::vector<media::KeySystemInfo>* concrete_key_systems, + // TODO(sandersd): Non-compositing support depends on the + // use_video_overlay_for_embedded_encrypted_video pref, which may differ per + // WebContents, meaning this cannot be a global setting for the renderer + // process. Handle this per WebContents instead. http://crbug.com/467779 + bool is_non_compositing_supported); // Add platform-supported key systems which are not explicitly handled // by Chrome. diff --git a/content/browser/media/cdm/browser_cdm_manager.cc b/content/browser/media/cdm/browser_cdm_manager.cc index 708cf58..3eb55f1 100644 --- a/content/browser/media/cdm/browser_cdm_manager.cc +++ b/content/browser/media/cdm/browser_cdm_manager.cc @@ -25,6 +25,10 @@ #include "media/base/cdm_promise.h" #include "media/base/limits.h" +#if defined(OS_ANDROID) +#include "content/public/common/renderer_preferences.h" +#endif + namespace content { using media::BrowserCdm; @@ -446,8 +450,23 @@ void BrowserCdmManager::AddCdm(int render_frame_id, DCHECK(task_runner_->RunsTasksOnCurrentThread()); DCHECK(!GetCdm(render_frame_id, cdm_id)); + bool use_secure_surface = false; + +#if defined(OS_ANDROID) + // TODO(sandersd): Pass the security level from key system instead. + // http://crbug.com/467779 + RenderFrameHost* rfh = + RenderFrameHost::FromID(render_process_id_, render_frame_id); + WebContents* web_contents = WebContents::FromRenderFrameHost(rfh); + if (web_contents) { + content::RendererPreferences* prefs = + web_contents->GetMutableRendererPrefs(); + use_secure_surface = prefs->use_video_overlay_for_embedded_encrypted_video; + } +#endif + scoped_ptr<BrowserCdm> cdm(media::CreateBrowserCdm( - key_system, BROWSER_CDM_MANAGER_CB(OnSessionMessage), + key_system, use_secure_surface, BROWSER_CDM_MANAGER_CB(OnSessionMessage), BROWSER_CDM_MANAGER_CB(OnSessionClosed), BROWSER_CDM_MANAGER_CB(OnLegacySessionError), BROWSER_CDM_MANAGER_CB(OnSessionKeysChange), diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc index 7c50987..1381a16 100644 --- a/content/browser/renderer_host/render_process_host_impl.cc +++ b/content/browser/renderer_host/render_process_host_impl.cc @@ -1354,7 +1354,6 @@ void RenderProcessHostImpl::PropagateBrowserCommandLineToRenderer( #if defined(OS_ANDROID) switches::kDisableGestureRequirementForMediaPlayback, switches::kDisableWebRTC, - switches::kMediaDrmEnableNonCompositing, switches::kDisableWebAudio, switches::kRendererWaitForJavaDebugger, #endif diff --git a/media/base/android/browser_cdm_factory_android.cc b/media/base/android/browser_cdm_factory_android.cc index 614c8d1..43f586f 100644 --- a/media/base/android/browser_cdm_factory_android.cc +++ b/media/base/android/browser_cdm_factory_android.cc @@ -15,6 +15,7 @@ namespace media { scoped_ptr<BrowserCdm> BrowserCdmFactoryAndroid::CreateBrowserCdm( const std::string& key_system, + bool use_secure_surface, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, const SessionErrorCB& session_error_cb, @@ -33,25 +34,22 @@ scoped_ptr<BrowserCdm> BrowserCdmFactoryAndroid::CreateBrowserCdm( return scoped_ptr<BrowserCdm>(); } - // TODO(xhwang/ddorwin): Pass the security level from key system. + // TODO(sandersd): Pass the security level from key system. // http://crbug.com/467779 if (key_system == kWidevineKeySystem) { MediaDrmBridge::SecurityLevel security_level = - MediaDrmBridge::SECURITY_LEVEL_3; - if (base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kMediaDrmEnableNonCompositing)) { - security_level = MediaDrmBridge::SECURITY_LEVEL_1; - } + use_secure_surface ? MediaDrmBridge::SECURITY_LEVEL_1 + : MediaDrmBridge::SECURITY_LEVEL_3; if (!cdm->SetSecurityLevel(security_level)) { DVLOG(1) << "failed to set security level " << security_level; return scoped_ptr<BrowserCdm>(); } } else { // Assume other key systems do not support full compositing. - if (!base::CommandLine::ForCurrentProcess()->HasSwitch( - switches::kMediaDrmEnableNonCompositing)) { - NOTREACHED() << key_system << " may require " - << switches::kMediaDrmEnableNonCompositing; + if (!use_secure_surface) { + NOTREACHED() + << key_system + << " may require use_video_overlay_for_embedded_encrypted_video"; return scoped_ptr<BrowserCdm>(); } } diff --git a/media/base/android/browser_cdm_factory_android.h b/media/base/android/browser_cdm_factory_android.h index ff0705b..17c61f7 100644 --- a/media/base/android/browser_cdm_factory_android.h +++ b/media/base/android/browser_cdm_factory_android.h @@ -18,6 +18,7 @@ class MEDIA_EXPORT BrowserCdmFactoryAndroid : public BrowserCdmFactory { scoped_ptr<BrowserCdm> CreateBrowserCdm( const std::string& key_system, + bool use_secure_surface, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, const SessionErrorCB& session_error_cb, diff --git a/media/base/browser_cdm_factory.cc b/media/base/browser_cdm_factory.cc index 81b6e97..46e96f5 100644 --- a/media/base/browser_cdm_factory.cc +++ b/media/base/browser_cdm_factory.cc @@ -23,6 +23,7 @@ void SetBrowserCdmFactory(BrowserCdmFactory* factory) { scoped_ptr<BrowserCdm> CreateBrowserCdm( const std::string& key_system, + bool use_secure_surface, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, const SessionErrorCB& session_error_cb, @@ -38,8 +39,8 @@ scoped_ptr<BrowserCdm> CreateBrowserCdm( } return g_cdm_factory->CreateBrowserCdm( - key_system, session_message_cb, session_closed_cb, session_error_cb, - session_keys_change_cb, session_expiration_update_cb); + key_system, use_secure_surface, session_message_cb, session_closed_cb, + session_error_cb, session_keys_change_cb, session_expiration_update_cb); } } // namespace media diff --git a/media/base/browser_cdm_factory.h b/media/base/browser_cdm_factory.h index f2bd29c..ecce0be 100644 --- a/media/base/browser_cdm_factory.h +++ b/media/base/browser_cdm_factory.h @@ -21,6 +21,7 @@ class MEDIA_EXPORT BrowserCdmFactory { virtual scoped_ptr<BrowserCdm> CreateBrowserCdm( const std::string& key_system, + bool use_secure_surface, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, const SessionErrorCB& session_error_cb, @@ -37,9 +38,12 @@ void SetBrowserCdmFactory(BrowserCdmFactory* factory); // Creates a BrowserCdm for |key_system|. Returns NULL if the CDM cannot be // created. +// |use_secure_surface| indicates that the CDM should be configured to output +// to a secure surface (for platforms that support it). // TODO(xhwang): Add ifdef for IPC based CDM. scoped_ptr<BrowserCdm> MEDIA_EXPORT CreateBrowserCdm(const std::string& key_system, + bool use_secure_surface, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, const SessionErrorCB& session_error_cb, diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 1ae376d..44dea87 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc @@ -21,10 +21,6 @@ const char kIgnoreResolutionLimitsForAcceleratedVideoDecode[] = // Disables the infobar popup for accessing protected media identifier. const char kDisableInfobarForProtectedMediaIdentifier[] = "disable-infobar-for-protected-media-identifier"; - -// Enables use of non-compositing MediaDrm decoding by default for Encrypted -// Media Extensions implementation. -const char kMediaDrmEnableNonCompositing[] = "mediadrm-enable-non-compositing"; #endif #if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_SOLARIS) diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 63cdf5a..8c509a1ee 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h @@ -21,7 +21,6 @@ MEDIA_EXPORT extern const char #if defined(OS_ANDROID) MEDIA_EXPORT extern const char kDisableInfobarForProtectedMediaIdentifier[]; -MEDIA_EXPORT extern const char kMediaDrmEnableNonCompositing[]; #endif #if defined(OS_LINUX) || defined(OS_FREEBSD) || defined(OS_SOLARIS) |