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 d453ad921fb1e10bbb68552c69243af9c751d587..b23dd3e63d189ba9349d0eeda6de7f16d036c658 100644 |
--- a/media/base/android/media_drm_bridge.cc |
+++ b/media/base/android/media_drm_bridge.cc |
@@ -25,7 +25,6 @@ |
#include "jni/MediaDrmBridge_jni.h" |
#include "media/base/android/media_client_android.h" |
#include "media/base/android/media_drm_bridge_delegate.h" |
-#include "media/base/android/media_task_runner.h" |
#include "media/base/cdm_key_information.h" |
#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
@@ -214,37 +213,6 @@ std::string GetSecurityLevelString( |
} // namespace |
-MediaDrmBridge::~MediaDrmBridge() { |
- DVLOG(1) << __FUNCTION__; |
- |
- DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); |
- |
- player_tracker_.NotifyCdmUnset(); |
-} |
- |
-void MediaDrmBridge::DeleteOnCorrectThread() { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
- DVLOG(1) << __FUNCTION__; |
- |
- JNIEnv* env = AttachCurrentThread(); |
- if (!j_media_drm_.is_null()) |
- Java_MediaDrmBridge_destroy(env, j_media_drm_.obj()); |
- |
- // After the call to Java_MediaDrmBridge_destroy() Java won't call native |
- // methods anymore, this is ensured by MediaDrmBridge.java. |
- |
- // CdmPromiseAdapter must be destroyed on the UI thread. |
- cdm_promise_adapter_.reset(); |
- |
- // Post deletion onto Media thread if we use it. |
- if (use_media_thread_) { |
- weak_factory_.InvalidateWeakPtrs(); |
- GetMediaTaskRunner()->DeleteSoon(FROM_HERE, this); |
- } else { |
- delete this; |
- } |
-} |
- |
// static |
bool MediaDrmBridge::IsAvailable() { |
if (base::android::BuildInfo::GetInstance()->sdk_int() < 19) |
@@ -286,7 +254,7 @@ std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() { |
} |
// static |
-ScopedMediaDrmBridgePtr MediaDrmBridge::Create( |
+scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( |
const std::string& key_system, |
const SessionMessageCB& session_message_cb, |
const SessionClosedCB& session_closed_cb, |
@@ -295,37 +263,32 @@ ScopedMediaDrmBridgePtr MediaDrmBridge::Create( |
const SessionExpirationUpdateCB& session_expiration_update_cb) { |
DVLOG(1) << __FUNCTION__; |
- scoped_ptr<MediaDrmBridge, BrowserCdmDeleter> media_drm_bridge; |
if (!IsAvailable()) |
- return media_drm_bridge.Pass(); |
+ return nullptr; |
UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); |
if (scheme_uuid.empty()) |
- return media_drm_bridge.Pass(); |
+ return nullptr; |
- media_drm_bridge.reset( |
+ scoped_refptr<MediaDrmBridge> media_drm_bridge( |
new MediaDrmBridge(scheme_uuid, session_message_cb, session_closed_cb, |
legacy_session_error_cb, session_keys_change_cb, |
session_expiration_update_cb)); |
if (media_drm_bridge->j_media_drm_.is_null()) |
- media_drm_bridge.reset(); |
+ media_drm_bridge = nullptr; |
- return media_drm_bridge.Pass(); |
+ return media_drm_bridge; |
} |
// static |
-ScopedMediaDrmBridgePtr MediaDrmBridge::CreateWithoutSessionSupport( |
+scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( |
const std::string& key_system) { |
return MediaDrmBridge::Create( |
key_system, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(), |
SessionKeysChangeCB(), SessionExpirationUpdateCB()); |
} |
-base::WeakPtr<MediaDrmBridge> MediaDrmBridge::WeakPtr() { |
- return weak_factory_.GetWeakPtr(); |
-} |
- |
void MediaDrmBridge::SetServerCertificate( |
const std::vector<uint8_t>& certificate, |
scoped_ptr<media::SimpleCdmPromise> promise) { |
@@ -452,14 +415,25 @@ CdmContext* MediaDrmBridge::GetCdmContext() { |
return nullptr; |
} |
+void MediaDrmBridge::DeleteOnCorrectThread() const { |
+ DVLOG(1) << __FUNCTION__; |
+ |
+ if (!task_runner_->BelongsToCurrentThread()) { |
+ // When DeleteSoon returns false, |this| will be leaked, which is okay. |
+ task_runner_->DeleteSoon(FROM_HERE, this); |
+ } else { |
+ delete this; |
+ } |
+} |
+ |
int MediaDrmBridge::RegisterPlayer(const base::Closure& new_key_cb, |
const base::Closure& cdm_unset_cb) { |
- DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); |
+ // |player_tracker_| can be accessed from any thread. |
return player_tracker_.RegisterPlayer(new_key_cb, cdm_unset_cb); |
} |
void MediaDrmBridge::UnregisterPlayer(int registration_id) { |
- DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); |
+ // |player_tracker_| can be accessed from any thread. |
player_tracker_.UnregisterPlayer(registration_id); |
} |
@@ -527,7 +501,14 @@ ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() { |
void MediaDrmBridge::SetMediaCryptoReadyCB( |
const MediaCryptoReadyCB& media_crypto_ready_cb) { |
- DCHECK(task_runner_->BelongsToCurrentThread()); |
+ if (!task_runner_->BelongsToCurrentThread()) { |
+ task_runner_->PostTask( |
+ FROM_HERE, |
+ base::Bind(&MediaDrmBridge::SetMediaCryptoReadyCB, |
+ weak_factory_.GetWeakPtr(), media_crypto_ready_cb)); |
+ return; |
+ } |
+ |
DVLOG(1) << __FUNCTION__; |
if (media_crypto_ready_cb.is_null()) { |
@@ -558,25 +539,27 @@ void MediaDrmBridge::OnMediaCryptoReady(JNIEnv* env, jobject j_media_drm) { |
return; |
task_runner_->PostTask( |
- FROM_HERE, base::Bind(&MediaDrmBridge::NotifyMediaCryptoReady, WeakPtr(), |
+ FROM_HERE, base::Bind(&MediaDrmBridge::NotifyMediaCryptoReady, |
+ weak_factory_.GetWeakPtr(), |
base::ResetAndReturn(&media_crypto_ready_cb_))); |
} |
void MediaDrmBridge::OnPromiseResolved(JNIEnv* env, |
jobject j_media_drm, |
jint j_promise_id) { |
- task_runner_->PostTask(FROM_HERE, base::Bind(&MediaDrmBridge::ResolvePromise, |
- WeakPtr(), j_promise_id)); |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&MediaDrmBridge::ResolvePromise, |
+ weak_factory_.GetWeakPtr(), j_promise_id)); |
} |
void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env, |
jobject j_media_drm, |
jint j_promise_id, |
jbyteArray j_session_id) { |
- task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&MediaDrmBridge::ResolvePromiseWithSession, WeakPtr(), |
- j_promise_id, GetSessionId(env, j_session_id))); |
+ task_runner_->PostTask(FROM_HERE, |
+ base::Bind(&MediaDrmBridge::ResolvePromiseWithSession, |
+ weak_factory_.GetWeakPtr(), j_promise_id, |
+ GetSessionId(env, j_session_id))); |
} |
void MediaDrmBridge::OnPromiseRejected(JNIEnv* env, |
@@ -585,8 +568,8 @@ void MediaDrmBridge::OnPromiseRejected(JNIEnv* env, |
jstring j_error_message) { |
task_runner_->PostTask( |
FROM_HERE, |
- base::Bind(&MediaDrmBridge::RejectPromise, WeakPtr(), j_promise_id, |
- ConvertJavaStringToUTF8(env, j_error_message))); |
+ base::Bind(&MediaDrmBridge::RejectPromise, weak_factory_.GetWeakPtr(), |
+ j_promise_id, ConvertJavaStringToUTF8(env, j_error_message))); |
} |
void MediaDrmBridge::OnSessionMessage(JNIEnv* env, |
@@ -626,7 +609,7 @@ void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env, |
DVLOG(2) << __FUNCTION__; |
if (has_additional_usable_key) |
- NotifyNewKeyOnCorrectThread(); |
+ player_tracker_.NotifyNewKey(); |
CdmKeysInfo cdm_keys_info; |
@@ -727,8 +710,6 @@ MediaDrmBridge::MediaDrmBridge( |
session_expiration_update_cb_(session_expiration_update_cb), |
cdm_promise_adapter_(new CdmPromiseAdapter()), |
task_runner_(base::ThreadTaskRunnerHandle::Get()), |
- use_media_thread_(UseMediaThreadForMediaPlayback()), |
- media_weak_factory_(this), |
weak_factory_(this) { |
DVLOG(1) << __FUNCTION__; |
@@ -741,6 +722,20 @@ MediaDrmBridge::MediaDrmBridge( |
env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this))); |
} |
+MediaDrmBridge::~MediaDrmBridge() { |
+ DCHECK(task_runner_->BelongsToCurrentThread()); |
+ DVLOG(1) << __FUNCTION__; |
+ |
+ JNIEnv* env = AttachCurrentThread(); |
+ |
+ // After the call to Java_MediaDrmBridge_destroy() Java won't call native |
+ // methods anymore, this is ensured by MediaDrmBridge.java. |
+ if (!j_media_drm_.is_null()) |
+ Java_MediaDrmBridge_destroy(env, j_media_drm_.obj()); |
+ |
+ player_tracker_.NotifyCdmUnset(); |
+} |
+ |
// TODO(ddorwin): This is specific to Widevine. http://crbug.com/459400 |
// static |
bool MediaDrmBridge::IsSecureDecoderRequired(SecurityLevel security_level) { |
@@ -757,21 +752,6 @@ MediaDrmBridge::SecurityLevel MediaDrmBridge::GetSecurityLevel() { |
return GetSecurityLevelFromString(security_level_str); |
} |
-void MediaDrmBridge::NotifyNewKeyOnCorrectThread() { |
- // Repost this method onto the Media thread if |use_media_thread_| is true. |
- if (use_media_thread_ && !GetMediaTaskRunner()->BelongsToCurrentThread()) { |
- GetMediaTaskRunner()->PostTask( |
- FROM_HERE, base::Bind(&MediaDrmBridge::NotifyNewKeyOnCorrectThread, |
- media_weak_factory_.GetWeakPtr())); |
- return; |
- } |
- |
- DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); |
- DVLOG(1) << __FUNCTION__; |
- |
- player_tracker_.NotifyNewKey(); |
-} |
- |
void MediaDrmBridge::NotifyMediaCryptoReady(const MediaCryptoReadyCB& cb) { |
DCHECK(task_runner_->BelongsToCurrentThread()); |