Chromium Code Reviews| Index: media/base/android/media_drm_bridge.cc |
| diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc |
| index 0633c31b98603f1f4e1b0ad99f291a1b261c6635..ab9999103907e50c49f70ef47a2867173b149936 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,18 @@ 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() { |
| + if (!AreMediaDrmApisAvailable()) |
| + return false; |
| + |
| + return MediaCodecUtil::IsMediaCodecAvailable(); |
|
xhwang
2016/03/02 06:57:08
nit: how about:
return AreMediaDrmApisAvailable()
ddorwin
2016/03/02 21:11:53
Done.
|
| +} |
| + |
| // static |
| bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| @@ -240,7 +254,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 +264,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 +290,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 +309,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(), |