diff options
author | ddorwin <ddorwin@chromium.org> | 2016-03-02 21:06:29 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-03 05:07:51 +0000 |
commit | f1f20728a18fff332af52c0e60726a8b34510ba6 (patch) | |
tree | f4c5b710675a1a3787b404cd2a31a7d7b7532067 /media/base/android/media_drm_bridge.cc | |
parent | fee5771921b6f93f36a3b102c30b3711db8b7b5b (diff) | |
download | chromium_src-f1f20728a18fff332af52c0e60726a8b34510ba6.zip chromium_src-f1f20728a18fff332af52c0e60726a8b34510ba6.tar.gz chromium_src-f1f20728a18fff332af52c0e60726a8b34510ba6.tar.bz2 |
EME on Android: Improve accuracy of Key System availability.
Implemented per https://crbug.com/582618#c7.
BUG=559236,582618
Review URL: https://codereview.chromium.org/1747073003
Cr-Commit-Position: refs/heads/master@{#378959}
Diffstat (limited to 'media/base/android/media_drm_bridge.cc')
-rw-r--r-- | media/base/android/media_drm_bridge.cc | 67 |
1 files changed, 55 insertions, 12 deletions
diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc index 0633c31..a5975f3 100644 --- a/media/base/android/media_drm_bridge.cc +++ b/media/base/android/media_drm_bridge.cc @@ -26,6 +26,7 @@ #include "base/thread_task_runner_handle.h" #include "jni/MediaDrmBridge_jni.h" #include "media/base/android/media_client_android.h" +#include "media/base/android/media_codec_util.h" #include "media/base/android/media_drm_bridge_delegate.h" #include "media/base/android/provision_fetcher.h" #include "media/base/cdm_key_information.h" @@ -174,8 +175,12 @@ base::LazyInstance<KeySystemManager>::Leaky g_key_system_manager = // resolved. bool IsKeySystemSupportedWithTypeImpl(const std::string& key_system, const std::string& container_mime_type) { - if (!MediaDrmBridge::IsAvailable()) + DCHECK(MediaDrmBridge::IsAvailable()); + + if (key_system.empty()) { + NOTREACHED(); return false; + } UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); if (scheme_uuid.empty()) @@ -215,10 +220,7 @@ std::string GetSecurityLevelString( return ""; } -} // namespace - -// static -bool MediaDrmBridge::IsAvailable() { +bool AreMediaDrmApisAvailable() { if (base::android::BuildInfo::GetInstance()->sdk_int() < 19) return false; @@ -233,6 +235,15 @@ bool MediaDrmBridge::IsAvailable() { return true; } +} // namespace + +// MediaDrm is not generally usable without MediaCodec. Thus, both the MediaDrm +// APIs and MediaCodec APIs must be enabled and not blacklisted. +// static +bool MediaDrmBridge::IsAvailable() { + return AreMediaDrmApisAvailable() && MediaCodecUtil::IsMediaCodecAvailable(); +} + // static bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { return RegisterNativesImpl(env); @@ -240,7 +251,9 @@ bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { // static bool MediaDrmBridge::IsKeySystemSupported(const std::string& key_system) { - DCHECK(!key_system.empty()); + if (!MediaDrmBridge::IsAvailable()) + return false; + return IsKeySystemSupportedWithTypeImpl(key_system, ""); } @@ -248,17 +261,24 @@ bool MediaDrmBridge::IsKeySystemSupported(const std::string& key_system) { bool MediaDrmBridge::IsKeySystemSupportedWithType( const std::string& key_system, const std::string& container_mime_type) { - DCHECK(!key_system.empty() && !container_mime_type.empty()); + DCHECK(!container_mime_type.empty()) << "Call IsKeySystemSupported instead"; + + if (!MediaDrmBridge::IsAvailable()) + return false; + return IsKeySystemSupportedWithTypeImpl(key_system, container_mime_type); } // static std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() { + if (!MediaDrmBridge::IsAvailable()) + return std::vector<std::string>(); + return g_key_system_manager.Get().GetPlatformKeySystemNames(); } // static -scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( +scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateInternal( const std::string& key_system, SecurityLevel security_level, const CreateFetcherCB& create_fetcher_cb, @@ -267,10 +287,8 @@ scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( const LegacySessionErrorCB& legacy_session_error_cb, const SessionKeysChangeCB& session_keys_change_cb, const SessionExpirationUpdateCB& session_expiration_update_cb) { - DVLOG(1) << __FUNCTION__; - - if (!IsAvailable()) - return nullptr; + // All paths requires the MediaDrmApis. + DCHECK(AreMediaDrmApisAvailable()); UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); if (scheme_uuid.empty()) @@ -288,12 +306,37 @@ scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( } // static +scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( + const std::string& key_system, + SecurityLevel security_level, + const CreateFetcherCB& create_fetcher_cb, + const SessionMessageCB& session_message_cb, + const SessionClosedCB& session_closed_cb, + const LegacySessionErrorCB& legacy_session_error_cb, + const SessionKeysChangeCB& session_keys_change_cb, + const SessionExpirationUpdateCB& session_expiration_update_cb) { + DVLOG(1) << __FUNCTION__; + + if (!IsAvailable()) + return nullptr; + + return CreateInternal(key_system, security_level, create_fetcher_cb, + session_message_cb, session_closed_cb, + legacy_session_error_cb, session_keys_change_cb, + session_expiration_update_cb); +} + +// static scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( const std::string& key_system, SecurityLevel security_level, const CreateFetcherCB& create_fetcher_cb) { DVLOG(1) << __FUNCTION__; + // Sessions won't be used so decoding capability is not required. + if (!AreMediaDrmApisAvailable()) + return nullptr; + return MediaDrmBridge::Create(key_system, security_level, create_fetcher_cb, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(), SessionKeysChangeCB(), |