diff options
Diffstat (limited to 'media/base/android')
-rw-r--r-- | media/base/android/media_drm_bridge.cc | 67 | ||||
-rw-r--r-- | media/base/android/media_drm_bridge.h | 16 |
2 files changed, 68 insertions, 15 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(), diff --git a/media/base/android/media_drm_bridge.h b/media/base/android/media_drm_bridge.h index 04e57fc..d5408c1 100644 --- a/media/base/android/media_drm_bridge.h +++ b/media/base/android/media_drm_bridge.h @@ -55,9 +55,9 @@ class MEDIA_EXPORT MediaDrmBridge : public MediaKeys, public PlayerTracker { using MediaCryptoReadyCB = base::Callback<void(JavaObjectPtr media_crypto, bool needs_protected_surface)>; - // Checks whether MediaDRM is available. - // All other static methods check IsAvailable() internally. There's no need - // to check IsAvailable() explicitly before calling them. + // Checks whether MediaDRM is available and usable, including for decoding. + // All other static methods check IsAvailable() or equivalent internally. + // There is no need to check IsAvailable() explicitly before calling them. static bool IsAvailable(); static bool RegisterMediaDrmBridge(JNIEnv* env); @@ -243,6 +243,16 @@ class MEDIA_EXPORT MediaDrmBridge : public MediaKeys, public PlayerTracker { // For DeleteSoon() in DeleteOnCorrectThread(). friend class base::DeleteHelper<MediaDrmBridge>; + static scoped_refptr<MediaDrmBridge> CreateInternal( + 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); + // Constructs a MediaDrmBridge for |scheme_uuid| and |security_level|. The // default security level will be used if |security_level| is // SECURITY_LEVEL_DEFAULT. Sessions should not be created if session callbacks |