summaryrefslogtreecommitdiffstats
path: root/media/base/android/media_drm_bridge.cc
diff options
context:
space:
mode:
Diffstat (limited to 'media/base/android/media_drm_bridge.cc')
-rw-r--r--media/base/android/media_drm_bridge.cc67
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(),