Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Side by Side Diff: media/base/android/media_drm_bridge.cc

Issue 1407933010: media: Make MediaKeys ref-counted. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/base/android/media_drm_bridge.h" 5 #include "media/base/android/media_drm_bridge.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/android/build_info.h" 9 #include "base/android/build_info.h"
10 #include "base/android/jni_array.h" 10 #include "base/android/jni_array.h"
11 #include "base/android/jni_string.h" 11 #include "base/android/jni_string.h"
12 #include "base/bind.h" 12 #include "base/bind.h"
13 #include "base/callback_helpers.h" 13 #include "base/callback_helpers.h"
14 #include "base/containers/hash_tables.h" 14 #include "base/containers/hash_tables.h"
15 #include "base/lazy_instance.h" 15 #include "base/lazy_instance.h"
16 #include "base/location.h" 16 #include "base/location.h"
17 #include "base/logging.h" 17 #include "base/logging.h"
18 #include "base/single_thread_task_runner.h" 18 #include "base/single_thread_task_runner.h"
19 #include "base/stl_util.h" 19 #include "base/stl_util.h"
20 #include "base/strings/string_number_conversions.h" 20 #include "base/strings/string_number_conversions.h"
21 #include "base/strings/string_util.h" 21 #include "base/strings/string_util.h"
22 #include "base/sys_byteorder.h" 22 #include "base/sys_byteorder.h"
23 #include "base/sys_info.h" 23 #include "base/sys_info.h"
24 #include "base/thread_task_runner_handle.h" 24 #include "base/thread_task_runner_handle.h"
25 #include "jni/MediaDrmBridge_jni.h" 25 #include "jni/MediaDrmBridge_jni.h"
26 #include "media/base/android/media_client_android.h" 26 #include "media/base/android/media_client_android.h"
27 #include "media/base/android/media_drm_bridge_delegate.h" 27 #include "media/base/android/media_drm_bridge_delegate.h"
28 #include "media/base/android/media_task_runner.h"
29 #include "media/base/cdm_key_information.h" 28 #include "media/base/cdm_key_information.h"
30 29
31 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 30 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
32 31
33 using base::android::AttachCurrentThread; 32 using base::android::AttachCurrentThread;
34 using base::android::ConvertUTF8ToJavaString; 33 using base::android::ConvertUTF8ToJavaString;
35 using base::android::ConvertJavaStringToUTF8; 34 using base::android::ConvertJavaStringToUTF8;
36 using base::android::JavaByteArrayToByteVector; 35 using base::android::JavaByteArrayToByteVector;
37 using base::android::ScopedJavaGlobalRef; 36 using base::android::ScopedJavaGlobalRef;
38 using base::android::ScopedJavaLocalRef; 37 using base::android::ScopedJavaLocalRef;
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 case MediaDrmBridge::SECURITY_LEVEL_1: 206 case MediaDrmBridge::SECURITY_LEVEL_1:
208 return "L1"; 207 return "L1";
209 case MediaDrmBridge::SECURITY_LEVEL_3: 208 case MediaDrmBridge::SECURITY_LEVEL_3:
210 return "L3"; 209 return "L3";
211 } 210 }
212 return ""; 211 return "";
213 } 212 }
214 213
215 } // namespace 214 } // namespace
216 215
217 MediaDrmBridge::~MediaDrmBridge() {
218 DVLOG(1) << __FUNCTION__;
219
220 DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread());
221
222 player_tracker_.NotifyCdmUnset();
223 }
224
225 void MediaDrmBridge::DeleteOnCorrectThread() {
226 DCHECK(task_runner_->BelongsToCurrentThread());
227 DVLOG(1) << __FUNCTION__;
228
229 JNIEnv* env = AttachCurrentThread();
230 if (!j_media_drm_.is_null())
231 Java_MediaDrmBridge_destroy(env, j_media_drm_.obj());
232
233 // After the call to Java_MediaDrmBridge_destroy() Java won't call native
234 // methods anymore, this is ensured by MediaDrmBridge.java.
235
236 // CdmPromiseAdapter must be destroyed on the UI thread.
237 cdm_promise_adapter_.reset();
238
239 // Post deletion onto Media thread if we use it.
240 if (use_media_thread_) {
241 weak_factory_.InvalidateWeakPtrs();
242 GetMediaTaskRunner()->DeleteSoon(FROM_HERE, this);
243 } else {
244 delete this;
245 }
246 }
247
248 // static 216 // static
249 bool MediaDrmBridge::IsAvailable() { 217 bool MediaDrmBridge::IsAvailable() {
250 if (base::android::BuildInfo::GetInstance()->sdk_int() < 19) 218 if (base::android::BuildInfo::GetInstance()->sdk_int() < 19)
251 return false; 219 return false;
252 220
253 int32 os_major_version = 0; 221 int32 os_major_version = 0;
254 int32 os_minor_version = 0; 222 int32 os_minor_version = 0;
255 int32 os_bugfix_version = 0; 223 int32 os_bugfix_version = 0;
256 base::SysInfo::OperatingSystemVersionNumbers( 224 base::SysInfo::OperatingSystemVersionNumbers(
257 &os_major_version, &os_minor_version, &os_bugfix_version); 225 &os_major_version, &os_minor_version, &os_bugfix_version);
(...skipping 21 matching lines...) Expand all
279 DCHECK(!key_system.empty() && !container_mime_type.empty()); 247 DCHECK(!key_system.empty() && !container_mime_type.empty());
280 return IsKeySystemSupportedWithTypeImpl(key_system, container_mime_type); 248 return IsKeySystemSupportedWithTypeImpl(key_system, container_mime_type);
281 } 249 }
282 250
283 // static 251 // static
284 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() { 252 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() {
285 return g_key_system_manager.Get().GetPlatformKeySystemNames(); 253 return g_key_system_manager.Get().GetPlatformKeySystemNames();
286 } 254 }
287 255
288 // static 256 // static
289 ScopedMediaDrmBridgePtr MediaDrmBridge::Create( 257 scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create(
290 const std::string& key_system, 258 const std::string& key_system,
291 const SessionMessageCB& session_message_cb, 259 const SessionMessageCB& session_message_cb,
292 const SessionClosedCB& session_closed_cb, 260 const SessionClosedCB& session_closed_cb,
293 const LegacySessionErrorCB& legacy_session_error_cb, 261 const LegacySessionErrorCB& legacy_session_error_cb,
294 const SessionKeysChangeCB& session_keys_change_cb, 262 const SessionKeysChangeCB& session_keys_change_cb,
295 const SessionExpirationUpdateCB& session_expiration_update_cb) { 263 const SessionExpirationUpdateCB& session_expiration_update_cb) {
296 DVLOG(1) << __FUNCTION__; 264 DVLOG(1) << __FUNCTION__;
297 265
298 scoped_ptr<MediaDrmBridge, BrowserCdmDeleter> media_drm_bridge;
299 if (!IsAvailable()) 266 if (!IsAvailable())
300 return media_drm_bridge.Pass(); 267 return nullptr;
301 268
302 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); 269 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system);
303 if (scheme_uuid.empty()) 270 if (scheme_uuid.empty())
304 return media_drm_bridge.Pass(); 271 return nullptr;
305 272
306 media_drm_bridge.reset( 273 scoped_refptr<MediaDrmBridge> media_drm_bridge(
307 new MediaDrmBridge(scheme_uuid, session_message_cb, session_closed_cb, 274 new MediaDrmBridge(scheme_uuid, session_message_cb, session_closed_cb,
308 legacy_session_error_cb, session_keys_change_cb, 275 legacy_session_error_cb, session_keys_change_cb,
309 session_expiration_update_cb)); 276 session_expiration_update_cb));
310 277
311 if (media_drm_bridge->j_media_drm_.is_null()) 278 if (media_drm_bridge->j_media_drm_.is_null())
312 media_drm_bridge.reset(); 279 media_drm_bridge = nullptr;
313 280
314 return media_drm_bridge.Pass(); 281 return media_drm_bridge;
315 } 282 }
316 283
317 // static 284 // static
318 ScopedMediaDrmBridgePtr MediaDrmBridge::CreateWithoutSessionSupport( 285 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport(
319 const std::string& key_system) { 286 const std::string& key_system) {
320 return MediaDrmBridge::Create( 287 return MediaDrmBridge::Create(
321 key_system, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(), 288 key_system, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(),
322 SessionKeysChangeCB(), SessionExpirationUpdateCB()); 289 SessionKeysChangeCB(), SessionExpirationUpdateCB());
323 } 290 }
324 291
325 base::WeakPtr<MediaDrmBridge> MediaDrmBridge::WeakPtr() {
326 return weak_factory_.GetWeakPtr();
327 }
328
329 void MediaDrmBridge::SetServerCertificate( 292 void MediaDrmBridge::SetServerCertificate(
330 const std::vector<uint8_t>& certificate, 293 const std::vector<uint8_t>& certificate,
331 scoped_ptr<media::SimpleCdmPromise> promise) { 294 scoped_ptr<media::SimpleCdmPromise> promise) {
332 DVLOG(2) << __FUNCTION__; 295 DVLOG(2) << __FUNCTION__;
333 296
334 DCHECK(!certificate.empty()); 297 DCHECK(!certificate.empty());
335 298
336 JNIEnv* env = AttachCurrentThread(); 299 JNIEnv* env = AttachCurrentThread();
337 ScopedJavaLocalRef<jbyteArray> j_certificate; 300 ScopedJavaLocalRef<jbyteArray> j_certificate;
338 if (Java_MediaDrmBridge_setServerCertificate(env, j_media_drm_.obj(), 301 if (Java_MediaDrmBridge_setServerCertificate(env, j_media_drm_.obj(),
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 408
446 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; 409 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android.";
447 promise->reject(NOT_SUPPORTED_ERROR, 0, "RemoveSession() is not supported."); 410 promise->reject(NOT_SUPPORTED_ERROR, 0, "RemoveSession() is not supported.");
448 } 411 }
449 412
450 CdmContext* MediaDrmBridge::GetCdmContext() { 413 CdmContext* MediaDrmBridge::GetCdmContext() {
451 NOTREACHED(); 414 NOTREACHED();
452 return nullptr; 415 return nullptr;
453 } 416 }
454 417
418 void MediaDrmBridge::DeleteOnCorrectThread() const {
419 DVLOG(1) << __FUNCTION__;
420
421 if (!task_runner_->BelongsToCurrentThread() &&
422 task_runner_->DeleteSoon(FROM_HERE, this)) {
Tima Vaisburd 2015/10/28 23:42:17 Why did you prefer potentially calling destructor
xhwang 2015/10/29 00:17:28 Good point. That's what I originally did. Then I s
423 return;
424 }
425 delete this;
426 }
427
455 int MediaDrmBridge::RegisterPlayer(const base::Closure& new_key_cb, 428 int MediaDrmBridge::RegisterPlayer(const base::Closure& new_key_cb,
456 const base::Closure& cdm_unset_cb) { 429 const base::Closure& cdm_unset_cb) {
457 DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); 430 // |player_tracker_| can be accessed from any thread.
458 return player_tracker_.RegisterPlayer(new_key_cb, cdm_unset_cb); 431 return player_tracker_.RegisterPlayer(new_key_cb, cdm_unset_cb);
459 } 432 }
460 433
461 void MediaDrmBridge::UnregisterPlayer(int registration_id) { 434 void MediaDrmBridge::UnregisterPlayer(int registration_id) {
462 DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); 435 // |player_tracker_| can be accessed from any thread.
463 player_tracker_.UnregisterPlayer(registration_id); 436 player_tracker_.UnregisterPlayer(registration_id);
464 } 437 }
465 438
466 bool MediaDrmBridge::SetSecurityLevel(SecurityLevel security_level) { 439 bool MediaDrmBridge::SetSecurityLevel(SecurityLevel security_level) {
467 if (security_level != SECURITY_LEVEL_NONE && 440 if (security_level != SECURITY_LEVEL_NONE &&
468 !std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) { 441 !std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) {
469 NOTREACHED() << "Widevine security level " << security_level 442 NOTREACHED() << "Widevine security level " << security_level
470 << "used with another key system"; 443 << "used with another key system";
471 return false; 444 return false;
472 } 445 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 493
521 ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() { 494 ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() {
522 DCHECK(task_runner_->BelongsToCurrentThread()); 495 DCHECK(task_runner_->BelongsToCurrentThread());
523 496
524 JNIEnv* env = AttachCurrentThread(); 497 JNIEnv* env = AttachCurrentThread();
525 return Java_MediaDrmBridge_getMediaCrypto(env, j_media_drm_.obj()); 498 return Java_MediaDrmBridge_getMediaCrypto(env, j_media_drm_.obj());
526 } 499 }
527 500
528 void MediaDrmBridge::SetMediaCryptoReadyCB( 501 void MediaDrmBridge::SetMediaCryptoReadyCB(
529 const MediaCryptoReadyCB& media_crypto_ready_cb) { 502 const MediaCryptoReadyCB& media_crypto_ready_cb) {
530 DCHECK(task_runner_->BelongsToCurrentThread()); 503 if (!task_runner_->BelongsToCurrentThread()) {
504 task_runner_->PostTask(
505 FROM_HERE,
506 base::Bind(&MediaDrmBridge::SetMediaCryptoReadyCB,
507 weak_factory_.GetWeakPtr(), media_crypto_ready_cb));
508 return;
509 }
510
531 DVLOG(1) << __FUNCTION__; 511 DVLOG(1) << __FUNCTION__;
532 512
533 if (media_crypto_ready_cb.is_null()) { 513 if (media_crypto_ready_cb.is_null()) {
534 media_crypto_ready_cb_.Reset(); 514 media_crypto_ready_cb_.Reset();
535 return; 515 return;
536 } 516 }
537 517
538 DCHECK(media_crypto_ready_cb_.is_null()); 518 DCHECK(media_crypto_ready_cb_.is_null());
539 519
540 // |media_crypto_ready_cb| is already bound to the correct thread 520 // |media_crypto_ready_cb| is already bound to the correct thread
(...skipping 10 matching lines...) Expand all
551 // only do minimal work and then post tasks to avoid reentrancy issues. 531 // only do minimal work and then post tasks to avoid reentrancy issues.
552 532
553 void MediaDrmBridge::OnMediaCryptoReady(JNIEnv* env, jobject j_media_drm) { 533 void MediaDrmBridge::OnMediaCryptoReady(JNIEnv* env, jobject j_media_drm) {
554 DCHECK(task_runner_->BelongsToCurrentThread()); 534 DCHECK(task_runner_->BelongsToCurrentThread());
555 DVLOG(1) << __FUNCTION__; 535 DVLOG(1) << __FUNCTION__;
556 536
557 if (media_crypto_ready_cb_.is_null()) 537 if (media_crypto_ready_cb_.is_null())
558 return; 538 return;
559 539
560 task_runner_->PostTask( 540 task_runner_->PostTask(
561 FROM_HERE, base::Bind(&MediaDrmBridge::NotifyMediaCryptoReady, WeakPtr(), 541 FROM_HERE, base::Bind(&MediaDrmBridge::NotifyMediaCryptoReady,
542 weak_factory_.GetWeakPtr(),
562 base::ResetAndReturn(&media_crypto_ready_cb_))); 543 base::ResetAndReturn(&media_crypto_ready_cb_)));
563 } 544 }
564 545
565 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env, 546 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env,
566 jobject j_media_drm, 547 jobject j_media_drm,
567 jint j_promise_id) { 548 jint j_promise_id) {
568 task_runner_->PostTask(FROM_HERE, base::Bind(&MediaDrmBridge::ResolvePromise, 549 task_runner_->PostTask(FROM_HERE,
569 WeakPtr(), j_promise_id)); 550 base::Bind(&MediaDrmBridge::ResolvePromise,
551 weak_factory_.GetWeakPtr(), j_promise_id));
570 } 552 }
571 553
572 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env, 554 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env,
573 jobject j_media_drm, 555 jobject j_media_drm,
574 jint j_promise_id, 556 jint j_promise_id,
575 jbyteArray j_session_id) { 557 jbyteArray j_session_id) {
576 task_runner_->PostTask( 558 task_runner_->PostTask(FROM_HERE,
577 FROM_HERE, 559 base::Bind(&MediaDrmBridge::ResolvePromiseWithSession,
578 base::Bind(&MediaDrmBridge::ResolvePromiseWithSession, WeakPtr(), 560 weak_factory_.GetWeakPtr(), j_promise_id,
579 j_promise_id, GetSessionId(env, j_session_id))); 561 GetSessionId(env, j_session_id)));
580 } 562 }
581 563
582 void MediaDrmBridge::OnPromiseRejected(JNIEnv* env, 564 void MediaDrmBridge::OnPromiseRejected(JNIEnv* env,
583 jobject j_media_drm, 565 jobject j_media_drm,
584 jint j_promise_id, 566 jint j_promise_id,
585 jstring j_error_message) { 567 jstring j_error_message) {
586 task_runner_->PostTask( 568 task_runner_->PostTask(
587 FROM_HERE, 569 FROM_HERE,
588 base::Bind(&MediaDrmBridge::RejectPromise, WeakPtr(), j_promise_id, 570 base::Bind(&MediaDrmBridge::RejectPromise, weak_factory_.GetWeakPtr(),
589 ConvertJavaStringToUTF8(env, j_error_message))); 571 j_promise_id, ConvertJavaStringToUTF8(env, j_error_message)));
590 } 572 }
591 573
592 void MediaDrmBridge::OnSessionMessage(JNIEnv* env, 574 void MediaDrmBridge::OnSessionMessage(JNIEnv* env,
593 jobject j_media_drm, 575 jobject j_media_drm,
594 jbyteArray j_session_id, 576 jbyteArray j_session_id,
595 jint j_message_type, 577 jint j_message_type,
596 jbyteArray j_message, 578 jbyteArray j_message,
597 jstring j_legacy_destination_url) { 579 jstring j_legacy_destination_url) {
598 DVLOG(2) << __FUNCTION__; 580 DVLOG(2) << __FUNCTION__;
599 581
(...skipping 19 matching lines...) Expand all
619 } 601 }
620 602
621 void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env, 603 void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env,
622 jobject j_media_drm, 604 jobject j_media_drm,
623 jbyteArray j_session_id, 605 jbyteArray j_session_id,
624 jobjectArray j_keys_info, 606 jobjectArray j_keys_info,
625 bool has_additional_usable_key) { 607 bool has_additional_usable_key) {
626 DVLOG(2) << __FUNCTION__; 608 DVLOG(2) << __FUNCTION__;
627 609
628 if (has_additional_usable_key) 610 if (has_additional_usable_key)
629 NotifyNewKeyOnCorrectThread(); 611 player_tracker_.NotifyNewKey();
630 612
631 CdmKeysInfo cdm_keys_info; 613 CdmKeysInfo cdm_keys_info;
632 614
633 size_t size = env->GetArrayLength(j_keys_info); 615 size_t size = env->GetArrayLength(j_keys_info);
634 DCHECK_GT(size, 0u); 616 DCHECK_GT(size, 0u);
635 617
636 for (size_t i = 0; i < size; ++i) { 618 for (size_t i = 0; i < size; ++i) {
637 ScopedJavaLocalRef<jobject> j_key_status( 619 ScopedJavaLocalRef<jobject> j_key_status(
638 env, env->GetObjectArrayElement(j_keys_info, i)); 620 env, env->GetObjectArrayElement(j_keys_info, i));
639 621
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 const SessionKeysChangeCB& session_keys_change_cb, 702 const SessionKeysChangeCB& session_keys_change_cb,
721 const SessionExpirationUpdateCB& session_expiration_update_cb) 703 const SessionExpirationUpdateCB& session_expiration_update_cb)
722 : scheme_uuid_(scheme_uuid), 704 : scheme_uuid_(scheme_uuid),
723 session_message_cb_(session_message_cb), 705 session_message_cb_(session_message_cb),
724 session_closed_cb_(session_closed_cb), 706 session_closed_cb_(session_closed_cb),
725 legacy_session_error_cb_(legacy_session_error_cb), 707 legacy_session_error_cb_(legacy_session_error_cb),
726 session_keys_change_cb_(session_keys_change_cb), 708 session_keys_change_cb_(session_keys_change_cb),
727 session_expiration_update_cb_(session_expiration_update_cb), 709 session_expiration_update_cb_(session_expiration_update_cb),
728 cdm_promise_adapter_(new CdmPromiseAdapter()), 710 cdm_promise_adapter_(new CdmPromiseAdapter()),
729 task_runner_(base::ThreadTaskRunnerHandle::Get()), 711 task_runner_(base::ThreadTaskRunnerHandle::Get()),
730 use_media_thread_(UseMediaThreadForMediaPlayback()),
731 media_weak_factory_(this),
732 weak_factory_(this) { 712 weak_factory_(this) {
733 DVLOG(1) << __FUNCTION__; 713 DVLOG(1) << __FUNCTION__;
734 714
735 JNIEnv* env = AttachCurrentThread(); 715 JNIEnv* env = AttachCurrentThread();
736 CHECK(env); 716 CHECK(env);
737 717
738 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = 718 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid =
739 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); 719 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size());
740 j_media_drm_.Reset(Java_MediaDrmBridge_create( 720 j_media_drm_.Reset(Java_MediaDrmBridge_create(
741 env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this))); 721 env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this)));
742 } 722 }
743 723
724 MediaDrmBridge::~MediaDrmBridge() {
725 DCHECK(task_runner_->BelongsToCurrentThread());
726 DVLOG(1) << __FUNCTION__;
727
728 JNIEnv* env = AttachCurrentThread();
729
730 // After the call to Java_MediaDrmBridge_destroy() Java won't call native
731 // methods anymore, this is ensured by MediaDrmBridge.java.
732 if (!j_media_drm_.is_null())
733 Java_MediaDrmBridge_destroy(env, j_media_drm_.obj());
734 }
735
744 // TODO(ddorwin): This is specific to Widevine. http://crbug.com/459400 736 // TODO(ddorwin): This is specific to Widevine. http://crbug.com/459400
745 // static 737 // static
746 bool MediaDrmBridge::IsSecureDecoderRequired(SecurityLevel security_level) { 738 bool MediaDrmBridge::IsSecureDecoderRequired(SecurityLevel security_level) {
747 DCHECK(IsAvailable()); 739 DCHECK(IsAvailable());
748 return SECURITY_LEVEL_1 == security_level; 740 return SECURITY_LEVEL_1 == security_level;
749 } 741 }
750 742
751 MediaDrmBridge::SecurityLevel MediaDrmBridge::GetSecurityLevel() { 743 MediaDrmBridge::SecurityLevel MediaDrmBridge::GetSecurityLevel() {
752 JNIEnv* env = AttachCurrentThread(); 744 JNIEnv* env = AttachCurrentThread();
753 ScopedJavaLocalRef<jstring> j_security_level = 745 ScopedJavaLocalRef<jstring> j_security_level =
754 Java_MediaDrmBridge_getSecurityLevel(env, j_media_drm_.obj()); 746 Java_MediaDrmBridge_getSecurityLevel(env, j_media_drm_.obj());
755 std::string security_level_str = 747 std::string security_level_str =
756 ConvertJavaStringToUTF8(env, j_security_level.obj()); 748 ConvertJavaStringToUTF8(env, j_security_level.obj());
757 return GetSecurityLevelFromString(security_level_str); 749 return GetSecurityLevelFromString(security_level_str);
758 } 750 }
759 751
760 void MediaDrmBridge::NotifyNewKeyOnCorrectThread() {
761 // Repost this method onto the Media thread if |use_media_thread_| is true.
762 if (use_media_thread_ && !GetMediaTaskRunner()->BelongsToCurrentThread()) {
763 GetMediaTaskRunner()->PostTask(
764 FROM_HERE, base::Bind(&MediaDrmBridge::NotifyNewKeyOnCorrectThread,
765 media_weak_factory_.GetWeakPtr()));
766 return;
767 }
768
769 DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread());
770 DVLOG(1) << __FUNCTION__;
771
772 player_tracker_.NotifyNewKey();
773 }
774
775 void MediaDrmBridge::NotifyMediaCryptoReady(const MediaCryptoReadyCB& cb) { 752 void MediaDrmBridge::NotifyMediaCryptoReady(const MediaCryptoReadyCB& cb) {
776 DCHECK(task_runner_->BelongsToCurrentThread()); 753 DCHECK(task_runner_->BelongsToCurrentThread());
777 754
778 DCHECK(!cb.is_null()); 755 DCHECK(!cb.is_null());
779 DCHECK(!GetMediaCrypto().is_null()); 756 DCHECK(!GetMediaCrypto().is_null());
780 757
781 // We can use scoped_ptr to pass ScopedJavaGlobalRef with a callback. 758 // We can use scoped_ptr to pass ScopedJavaGlobalRef with a callback.
782 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr( 759 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr(
783 new ScopedJavaGlobalRef<jobject>()); 760 new ScopedJavaGlobalRef<jobject>());
784 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj()); 761 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj());
785 762
786 cb.Run(j_object_ptr.Pass(), IsProtectedSurfaceRequired()); 763 cb.Run(j_object_ptr.Pass(), IsProtectedSurfaceRequired());
787 } 764 }
788 765
789 } // namespace media 766 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698