Chromium Code Reviews| 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(); |
|
Tima Vaisburd
2015/10/29 01:17:53
There seem to be no players to notify, right? If y
xhwang
2015/10/29 03:12:31
The fact that the callback won't fire is an implem
|
| +} |
| + |
| // 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()); |