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 dbcd1871b81b542ade6750b9b5247366dba2758a..b6272596c74d5cd6a7765d0ec35365f83c7ef9b0 100644 |
--- a/media/base/android/media_drm_bridge.cc |
+++ b/media/base/android/media_drm_bridge.cc |
@@ -15,7 +15,6 @@ |
#include "base/message_loop/message_loop_proxy.h" |
#include "base/strings/string_util.h" |
#include "jni/MediaDrmBridge_jni.h" |
-#include "media/base/android/media_player_manager.h" |
#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
@@ -223,10 +222,8 @@ bool MediaDrmBridge::IsSecurityLevelSupported(const std::string& key_system, |
if (!IsAvailable()) |
return false; |
- // Pass 0 as |cdm_id| and NULL as |manager| as they are not used in |
- // creation time of MediaDrmBridge. |
scoped_ptr<MediaDrmBridge> media_drm_bridge = |
- MediaDrmBridge::Create(0, key_system, GURL(), NULL); |
+ MediaDrmBridge::CreateSessionless(key_system); |
if (!media_drm_bridge) |
return false; |
@@ -251,14 +248,18 @@ bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { |
return RegisterNativesImpl(env); |
} |
-MediaDrmBridge::MediaDrmBridge(int cdm_id, |
- const std::vector<uint8>& scheme_uuid, |
- const GURL& security_origin, |
- MediaPlayerManager* manager) |
- : cdm_id_(cdm_id), |
- scheme_uuid_(scheme_uuid), |
- security_origin_(security_origin), |
- manager_(manager) { |
+MediaDrmBridge::MediaDrmBridge(const std::vector<uint8>& scheme_uuid, |
+ const SessionCreatedCB& session_created_cb, |
+ const SessionMessageCB& session_message_cb, |
+ const SessionReadyCB& session_ready_cb, |
+ const SessionClosedCB& session_closed_cb, |
+ const SessionErrorCB& session_error_cb) |
+ : scheme_uuid_(scheme_uuid), |
+ session_created_cb_(session_created_cb), |
+ session_message_cb_(session_message_cb), |
+ session_ready_cb_(session_ready_cb), |
+ session_closed_cb_(session_closed_cb), |
+ session_error_cb_(session_error_cb) { |
JNIEnv* env = AttachCurrentThread(); |
CHECK(env); |
@@ -275,10 +276,13 @@ MediaDrmBridge::~MediaDrmBridge() { |
} |
// static |
-scoped_ptr<MediaDrmBridge> MediaDrmBridge::Create(int cdm_id, |
- const std::string& key_system, |
- const GURL& security_origin, |
- MediaPlayerManager* manager) { |
+scoped_ptr<MediaDrmBridge> MediaDrmBridge::Create( |
+ const std::string& key_system, |
+ const SessionCreatedCB& session_created_cb, |
+ const SessionMessageCB& session_message_cb, |
+ const SessionReadyCB& session_ready_cb, |
+ const SessionClosedCB& session_closed_cb, |
+ const SessionErrorCB& session_error_cb) { |
scoped_ptr<MediaDrmBridge> media_drm_bridge; |
if (!IsAvailable()) |
return media_drm_bridge.Pass(); |
@@ -287,14 +291,30 @@ scoped_ptr<MediaDrmBridge> MediaDrmBridge::Create(int cdm_id, |
if (scheme_uuid.empty()) |
return media_drm_bridge.Pass(); |
- media_drm_bridge.reset( |
- new MediaDrmBridge(cdm_id, scheme_uuid, security_origin, manager)); |
+ media_drm_bridge.reset(new MediaDrmBridge(scheme_uuid, |
+ session_created_cb, |
+ session_message_cb, |
+ session_ready_cb, |
+ session_closed_cb, |
+ session_error_cb)); |
+ |
if (media_drm_bridge->j_media_drm_.is_null()) |
media_drm_bridge.reset(); |
return media_drm_bridge.Pass(); |
} |
+// static |
+scoped_ptr<MediaDrmBridge> MediaDrmBridge::CreateSessionless( |
+ const std::string& key_system) { |
+ return MediaDrmBridge::Create(key_system, |
+ SessionCreatedCB(), |
+ SessionMessageCB(), |
+ SessionReadyCB(), |
+ SessionClosedCB(), |
+ SessionErrorCB()); |
+} |
+ |
bool MediaDrmBridge::SetSecurityLevel(SecurityLevel security_level) { |
JNIEnv* env = AttachCurrentThread(); |
@@ -312,6 +332,11 @@ bool MediaDrmBridge::CreateSession(uint32 session_id, |
const std::string& content_type, |
const uint8* init_data, |
int init_data_length) { |
+ DVLOG(1) << __FUNCTION__; |
+ |
+ DCHECK(!session_created_cb_.is_null()) |
+ << "CreateSession called on a sessionless MediaDrmBridge object."; |
+ |
JNIEnv* env = AttachCurrentThread(); |
ScopedJavaLocalRef<jbyteArray> j_init_data; |
// Caller should always use "video/*" content types. |
@@ -348,6 +373,10 @@ void MediaDrmBridge::UpdateSession(uint32 session_id, |
const uint8* response, |
int response_length) { |
DVLOG(1) << __FUNCTION__; |
+ |
+ DCHECK(!session_ready_cb_.is_null()) |
+ << __FUNCTION__ << " called on a sessionless MediaDrmBridge object."; |
+ |
JNIEnv* env = AttachCurrentThread(); |
ScopedJavaLocalRef<jbyteArray> j_response = |
base::android::ToJavaByteArray(env, response, response_length); |
@@ -357,6 +386,10 @@ void MediaDrmBridge::UpdateSession(uint32 session_id, |
void MediaDrmBridge::ReleaseSession(uint32 session_id) { |
DVLOG(1) << __FUNCTION__; |
+ |
+ DCHECK(!session_closed_cb_.is_null()) |
+ << __FUNCTION__ << " called on a sessionless MediaDrmBridge object."; |
+ |
JNIEnv* env = AttachCurrentThread(); |
Java_MediaDrmBridge_releaseSession(env, j_media_drm_.obj(), session_id); |
} |
@@ -389,7 +422,7 @@ void MediaDrmBridge::OnSessionCreated(JNIEnv* env, |
jstring j_web_session_id) { |
uint32 session_id = j_session_id; |
std::string web_session_id = ConvertJavaStringToUTF8(env, j_web_session_id); |
- manager_->OnSessionCreated(cdm_id_, session_id, web_session_id); |
+ session_created_cb_.Run(session_id, web_session_id); |
} |
void MediaDrmBridge::OnSessionMessage(JNIEnv* env, |
@@ -401,35 +434,28 @@ void MediaDrmBridge::OnSessionMessage(JNIEnv* env, |
std::vector<uint8> message; |
JavaByteArrayToByteVector(env, j_message, &message); |
std::string destination_url = ConvertJavaStringToUTF8(env, j_destination_url); |
- GURL destination_gurl(destination_url); |
- if (!destination_gurl.is_valid() && !destination_gurl.is_empty()) { |
- DLOG(WARNING) << "SessionMessage destination_url is invalid : " |
- << destination_gurl.possibly_invalid_spec(); |
- destination_gurl = GURL::EmptyGURL(); // Replace invalid destination_url. |
- } |
- |
- manager_->OnSessionMessage(cdm_id_, session_id, message, destination_gurl); |
+ session_message_cb_.Run(session_id, message, destination_url); |
} |
void MediaDrmBridge::OnSessionReady(JNIEnv* env, |
jobject j_media_drm, |
jint j_session_id) { |
uint32 session_id = j_session_id; |
- manager_->OnSessionReady(cdm_id_, session_id); |
+ session_ready_cb_.Run(session_id); |
} |
void MediaDrmBridge::OnSessionClosed(JNIEnv* env, |
jobject j_media_drm, |
jint j_session_id) { |
uint32 session_id = j_session_id; |
- manager_->OnSessionClosed(cdm_id_, session_id); |
+ session_closed_cb_.Run(session_id); |
} |
void MediaDrmBridge::OnSessionError(JNIEnv* env, |
jobject j_media_drm, |
jint j_session_id) { |
uint32 session_id = j_session_id; |
- manager_->OnSessionError(cdm_id_, session_id, MediaKeys::kUnknownError, 0); |
+ session_error_cb_.Run(session_id, MediaKeys::kUnknownError, 0); |
} |
ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() { |