| 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..a5975f3662f0aef3552040e326c8ccf2de0a37bb 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(),
|
|
|