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

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

Issue 1427183002: Move MediaDrmBridge provision communication to native side. (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" 28 #include "media/base/android/media_task_runner.h"
29 #include "media/base/android/provision_fetcher.h"
30 #include "media/base/bind_to_current_loop.h"
29 #include "media/base/cdm_key_information.h" 31 #include "media/base/cdm_key_information.h"
30 32
31 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 33 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
32 34
33 using base::android::AttachCurrentThread; 35 using base::android::AttachCurrentThread;
34 using base::android::ConvertUTF8ToJavaString; 36 using base::android::ConvertUTF8ToJavaString;
35 using base::android::ConvertJavaStringToUTF8; 37 using base::android::ConvertJavaStringToUTF8;
36 using base::android::JavaByteArrayToByteVector; 38 using base::android::JavaByteArrayToByteVector;
37 using base::android::ScopedJavaGlobalRef; 39 using base::android::ScopedJavaGlobalRef;
38 using base::android::ScopedJavaLocalRef; 40 using base::android::ScopedJavaLocalRef;
(...skipping 13 matching lines...) Expand all
52 // These must be in sync with Android MediaDrm KEY_STATUS_XXX constants: 54 // These must be in sync with Android MediaDrm KEY_STATUS_XXX constants:
53 // https://developer.android.com/reference/android/media/MediaDrm.KeyStatus.html 55 // https://developer.android.com/reference/android/media/MediaDrm.KeyStatus.html
54 enum class KeyStatus { 56 enum class KeyStatus {
55 KEY_STATUS_USABLE = 0, 57 KEY_STATUS_USABLE = 0,
56 KEY_STATUS_EXPIRED = 1, 58 KEY_STATUS_EXPIRED = 1,
57 KEY_STATUS_OUTPUT_NOT_ALLOWED = 2, 59 KEY_STATUS_OUTPUT_NOT_ALLOWED = 2,
58 KEY_STATUS_PENDING = 3, 60 KEY_STATUS_PENDING = 3,
59 KEY_STATUS_INTERNAL_ERROR = 4, 61 KEY_STATUS_INTERNAL_ERROR = 4,
60 }; 62 };
61 63
62 // Returns string session ID from jbyteArray (byte[] in Java). 64 // Converts jbyteArray (byte[] in Java) into std::string.
63 std::string GetSessionId(JNIEnv* env, jbyteArray j_session_id) { 65 std::string AsString(JNIEnv* env, jbyteArray j_byte_array) {
64 std::vector<uint8> session_id_vector; 66 std::vector<uint8_t> byte_vector;
65 JavaByteArrayToByteVector(env, j_session_id, &session_id_vector); 67 JavaByteArrayToByteVector(env, j_byte_array, &byte_vector);
66 return std::string(session_id_vector.begin(), session_id_vector.end()); 68 return std::string(byte_vector.begin(), byte_vector.end());
67 } 69 }
68 70
69 const uint8 kWidevineUuid[16] = { 71 const uint8 kWidevineUuid[16] = {
70 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, // 72 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, //
71 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED}; 73 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED};
72 74
73 // Convert |init_data_type| to a string supported by MediaDRM. 75 // Convert |init_data_type| to a string supported by MediaDRM.
74 // "audio"/"video" does not matter, so use "video". 76 // "audio"/"video" does not matter, so use "video".
75 std::string ConvertInitDataType(media::EmeInitDataType init_data_type) { 77 std::string ConvertInitDataType(media::EmeInitDataType init_data_type) {
76 // TODO(jrummell/xhwang): EME init data types like "webm" and "cenc" are 78 // TODO(jrummell/xhwang): EME init data types like "webm" and "cenc" are
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 } 283 }
282 284
283 // static 285 // static
284 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() { 286 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() {
285 return g_key_system_manager.Get().GetPlatformKeySystemNames(); 287 return g_key_system_manager.Get().GetPlatformKeySystemNames();
286 } 288 }
287 289
288 // static 290 // static
289 ScopedMediaDrmBridgePtr MediaDrmBridge::Create( 291 ScopedMediaDrmBridgePtr MediaDrmBridge::Create(
290 const std::string& key_system, 292 const std::string& key_system,
293 scoped_ptr<ProvisionFetcher> provision_fetcher,
291 const SessionMessageCB& session_message_cb, 294 const SessionMessageCB& session_message_cb,
292 const SessionClosedCB& session_closed_cb, 295 const SessionClosedCB& session_closed_cb,
293 const LegacySessionErrorCB& legacy_session_error_cb, 296 const LegacySessionErrorCB& legacy_session_error_cb,
294 const SessionKeysChangeCB& session_keys_change_cb, 297 const SessionKeysChangeCB& session_keys_change_cb,
295 const SessionExpirationUpdateCB& session_expiration_update_cb) { 298 const SessionExpirationUpdateCB& session_expiration_update_cb) {
296 DVLOG(1) << __FUNCTION__; 299 DVLOG(1) << __FUNCTION__;
297 300
298 scoped_ptr<MediaDrmBridge, BrowserCdmDeleter> media_drm_bridge; 301 scoped_ptr<MediaDrmBridge, BrowserCdmDeleter> media_drm_bridge;
299 if (!IsAvailable()) 302 if (!IsAvailable())
300 return media_drm_bridge.Pass(); 303 return media_drm_bridge.Pass();
301 304
302 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); 305 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system);
303 if (scheme_uuid.empty()) 306 if (scheme_uuid.empty())
304 return media_drm_bridge.Pass(); 307 return media_drm_bridge.Pass();
305 308
306 media_drm_bridge.reset( 309 media_drm_bridge.reset(new MediaDrmBridge(
307 new MediaDrmBridge(scheme_uuid, session_message_cb, session_closed_cb, 310 scheme_uuid, provision_fetcher.Pass(), session_message_cb,
308 legacy_session_error_cb, session_keys_change_cb, 311 session_closed_cb, legacy_session_error_cb, session_keys_change_cb,
309 session_expiration_update_cb)); 312 session_expiration_update_cb));
310 313
311 if (media_drm_bridge->j_media_drm_.is_null()) 314 if (media_drm_bridge->j_media_drm_.is_null())
312 media_drm_bridge.reset(); 315 media_drm_bridge.reset();
313 316
314 return media_drm_bridge.Pass(); 317 return media_drm_bridge.Pass();
315 } 318 }
316 319
317 // static 320 // static
318 ScopedMediaDrmBridgePtr MediaDrmBridge::CreateWithoutSessionSupport( 321 ScopedMediaDrmBridgePtr MediaDrmBridge::CreateWithoutSessionSupport(
319 const std::string& key_system) { 322 const std::string& key_system,
320 return MediaDrmBridge::Create( 323 scoped_ptr<ProvisionFetcher> provision_fetcher) {
321 key_system, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(), 324 return MediaDrmBridge::Create(key_system, provision_fetcher.Pass(),
322 SessionKeysChangeCB(), SessionExpirationUpdateCB()); 325 SessionMessageCB(), SessionClosedCB(),
326 LegacySessionErrorCB(), SessionKeysChangeCB(),
327 SessionExpirationUpdateCB());
323 } 328 }
324 329
325 base::WeakPtr<MediaDrmBridge> MediaDrmBridge::WeakPtr() { 330 base::WeakPtr<MediaDrmBridge> MediaDrmBridge::WeakPtr() {
326 return weak_factory_.GetWeakPtr(); 331 return weak_factory_.GetWeakPtr();
327 } 332 }
328 333
329 void MediaDrmBridge::SetServerCertificate( 334 void MediaDrmBridge::SetServerCertificate(
330 const std::vector<uint8_t>& certificate, 335 const std::vector<uint8_t>& certificate,
331 scoped_ptr<media::SimpleCdmPromise> promise) { 336 scoped_ptr<media::SimpleCdmPromise> promise) {
332 DVLOG(2) << __FUNCTION__; 337 DVLOG(2) << __FUNCTION__;
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 // For Widevine, this depends on the security level. 492 // For Widevine, this depends on the security level.
488 if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) 493 if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid))
489 return IsSecureDecoderRequired(GetSecurityLevel()); 494 return IsSecureDecoderRequired(GetSecurityLevel());
490 495
491 // For other key systems, assume true. 496 // For other key systems, assume true.
492 return true; 497 return true;
493 } 498 }
494 499
495 void MediaDrmBridge::ResetDeviceCredentials( 500 void MediaDrmBridge::ResetDeviceCredentials(
496 const ResetCredentialsCB& callback) { 501 const ResetCredentialsCB& callback) {
502 DVLOG(1) << "MediaDrmBridge::" << __FUNCTION__;
xhwang 2015/11/02 20:37:05 nit: In other places we don't use the "MediaDrmBri
Tima Vaisburd 2015/11/05 02:24:07 Class name removed.
503
497 DCHECK(reset_credentials_cb_.is_null()); 504 DCHECK(reset_credentials_cb_.is_null());
498 reset_credentials_cb_ = callback; 505 reset_credentials_cb_ = callback;
499 JNIEnv* env = AttachCurrentThread(); 506 JNIEnv* env = AttachCurrentThread();
500 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj()); 507 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj());
501 } 508 }
502 509
503 void MediaDrmBridge::ResolvePromise(uint32_t promise_id) { 510 void MediaDrmBridge::ResolvePromise(uint32_t promise_id) {
504 DVLOG(2) << __FUNCTION__; 511 DVLOG(2) << __FUNCTION__;
505 cdm_promise_adapter_->ResolvePromise(promise_id); 512 cdm_promise_adapter_->ResolvePromise(promise_id);
506 } 513 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 DVLOG(1) << __FUNCTION__; 562 DVLOG(1) << __FUNCTION__;
556 563
557 if (media_crypto_ready_cb_.is_null()) 564 if (media_crypto_ready_cb_.is_null())
558 return; 565 return;
559 566
560 task_runner_->PostTask( 567 task_runner_->PostTask(
561 FROM_HERE, base::Bind(&MediaDrmBridge::NotifyMediaCryptoReady, WeakPtr(), 568 FROM_HERE, base::Bind(&MediaDrmBridge::NotifyMediaCryptoReady, WeakPtr(),
562 base::ResetAndReturn(&media_crypto_ready_cb_))); 569 base::ResetAndReturn(&media_crypto_ready_cb_)));
563 } 570 }
564 571
572 void MediaDrmBridge::OnStartProvisioning(JNIEnv* env,
573 jobject j_media_drm,
574 jstring j_default_url,
575 jbyteArray j_request_data) {
576 DVLOG(1) << __FUNCTION__;
577
578 task_runner_->PostTask(
579 FROM_HERE, base::Bind(&MediaDrmBridge::SendProvisioningRequest, WeakPtr(),
580 ConvertJavaStringToUTF8(env, j_default_url),
581 AsString(env, j_request_data)));
582 }
583
565 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env, 584 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env,
566 jobject j_media_drm, 585 jobject j_media_drm,
567 jint j_promise_id) { 586 jint j_promise_id) {
568 task_runner_->PostTask(FROM_HERE, base::Bind(&MediaDrmBridge::ResolvePromise, 587 task_runner_->PostTask(FROM_HERE, base::Bind(&MediaDrmBridge::ResolvePromise,
569 WeakPtr(), j_promise_id)); 588 WeakPtr(), j_promise_id));
570 } 589 }
571 590
572 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env, 591 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env,
573 jobject j_media_drm, 592 jobject j_media_drm,
574 jint j_promise_id, 593 jint j_promise_id,
575 jbyteArray j_session_id) { 594 jbyteArray j_session_id) {
576 task_runner_->PostTask( 595 task_runner_->PostTask(
577 FROM_HERE, 596 FROM_HERE,
578 base::Bind(&MediaDrmBridge::ResolvePromiseWithSession, WeakPtr(), 597 base::Bind(&MediaDrmBridge::ResolvePromiseWithSession, WeakPtr(),
579 j_promise_id, GetSessionId(env, j_session_id))); 598 j_promise_id, AsString(env, j_session_id)));
580 } 599 }
581 600
582 void MediaDrmBridge::OnPromiseRejected(JNIEnv* env, 601 void MediaDrmBridge::OnPromiseRejected(JNIEnv* env,
583 jobject j_media_drm, 602 jobject j_media_drm,
584 jint j_promise_id, 603 jint j_promise_id,
585 jstring j_error_message) { 604 jstring j_error_message) {
586 task_runner_->PostTask( 605 task_runner_->PostTask(
587 FROM_HERE, 606 FROM_HERE,
588 base::Bind(&MediaDrmBridge::RejectPromise, WeakPtr(), j_promise_id, 607 base::Bind(&MediaDrmBridge::RejectPromise, WeakPtr(), j_promise_id,
589 ConvertJavaStringToUTF8(env, j_error_message))); 608 ConvertJavaStringToUTF8(env, j_error_message)));
590 } 609 }
591 610
592 void MediaDrmBridge::OnSessionMessage(JNIEnv* env, 611 void MediaDrmBridge::OnSessionMessage(JNIEnv* env,
593 jobject j_media_drm, 612 jobject j_media_drm,
594 jbyteArray j_session_id, 613 jbyteArray j_session_id,
595 jint j_message_type, 614 jint j_message_type,
596 jbyteArray j_message, 615 jbyteArray j_message,
597 jstring j_legacy_destination_url) { 616 jstring j_legacy_destination_url) {
598 DVLOG(2) << __FUNCTION__; 617 DVLOG(2) << __FUNCTION__;
599 618
600 std::vector<uint8> message; 619 std::vector<uint8> message;
601 JavaByteArrayToByteVector(env, j_message, &message); 620 JavaByteArrayToByteVector(env, j_message, &message);
602 GURL legacy_destination_url = 621 GURL legacy_destination_url =
603 GURL(ConvertJavaStringToUTF8(env, j_legacy_destination_url)); 622 GURL(ConvertJavaStringToUTF8(env, j_legacy_destination_url));
604 MediaKeys::MessageType message_type = 623 MediaKeys::MessageType message_type =
605 GetMessageType(static_cast<RequestType>(j_message_type)); 624 GetMessageType(static_cast<RequestType>(j_message_type));
606 625
607 task_runner_->PostTask( 626 task_runner_->PostTask(
608 FROM_HERE, 627 FROM_HERE, base::Bind(session_message_cb_, AsString(env, j_session_id),
609 base::Bind(session_message_cb_, GetSessionId(env, j_session_id), 628 message_type, message, legacy_destination_url));
610 message_type, message, legacy_destination_url));
611 } 629 }
612 630
613 void MediaDrmBridge::OnSessionClosed(JNIEnv* env, 631 void MediaDrmBridge::OnSessionClosed(JNIEnv* env,
614 jobject j_media_drm, 632 jobject j_media_drm,
615 jbyteArray j_session_id) { 633 jbyteArray j_session_id) {
616 DVLOG(2) << __FUNCTION__; 634 DVLOG(2) << __FUNCTION__;
617 std::string session_id = GetSessionId(env, j_session_id); 635 std::string session_id = AsString(env, j_session_id);
618 task_runner_->PostTask(FROM_HERE, base::Bind(session_closed_cb_, session_id)); 636 task_runner_->PostTask(FROM_HERE, base::Bind(session_closed_cb_, session_id));
619 } 637 }
620 638
621 void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env, 639 void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env,
622 jobject j_media_drm, 640 jobject j_media_drm,
623 jbyteArray j_session_id, 641 jbyteArray j_session_id,
624 jobjectArray j_keys_info, 642 jobjectArray j_keys_info,
625 bool has_additional_usable_key) { 643 bool has_additional_usable_key) {
626 DVLOG(2) << __FUNCTION__; 644 DVLOG(2) << __FUNCTION__;
627 645
(...skipping 26 matching lines...) Expand all
654 // TODO(xhwang): Update CdmKeyInformation to take key_id and status in the 672 // TODO(xhwang): Update CdmKeyInformation to take key_id and status in the
655 // constructor. 673 // constructor.
656 scoped_ptr<CdmKeyInformation> cdm_key_information(new CdmKeyInformation()); 674 scoped_ptr<CdmKeyInformation> cdm_key_information(new CdmKeyInformation());
657 cdm_key_information->key_id = key_id; 675 cdm_key_information->key_id = key_id;
658 cdm_key_information->status = key_status; 676 cdm_key_information->status = key_status;
659 cdm_keys_info.push_back(cdm_key_information.release()); 677 cdm_keys_info.push_back(cdm_key_information.release());
660 } 678 }
661 679
662 task_runner_->PostTask( 680 task_runner_->PostTask(
663 FROM_HERE, 681 FROM_HERE,
664 base::Bind(session_keys_change_cb_, GetSessionId(env, j_session_id), 682 base::Bind(session_keys_change_cb_, AsString(env, j_session_id),
665 has_additional_usable_key, base::Passed(&cdm_keys_info))); 683 has_additional_usable_key, base::Passed(&cdm_keys_info)));
666 } 684 }
667 685
668 // According to MeidaDrm documentation [1], zero |expiry_time_ms| means the keys 686 // According to MeidaDrm documentation [1], zero |expiry_time_ms| means the keys
669 // will never expire. This will be translated into a NULL base::Time() [2], 687 // will never expire. This will be translated into a NULL base::Time() [2],
670 // which will then be mapped to a zero Java time [3]. The zero Java time is 688 // which will then be mapped to a zero Java time [3]. The zero Java time is
671 // passed to Blink which will then be translated to NaN [4], which is what the 689 // passed to Blink which will then be translated to NaN [4], which is what the
672 // spec uses to indicate that the license will never expire [5]. 690 // spec uses to indicate that the license will never expire [5].
673 // [1] 691 // [1]
674 // http://developer.android.com/reference/android/media/MediaDrm.OnExpirationUpd ateListener.html 692 // http://developer.android.com/reference/android/media/MediaDrm.OnExpirationUpd ateListener.html
675 // [2] See base::Time::FromDoubleT() 693 // [2] See base::Time::FromDoubleT()
676 // [3] See base::Time::ToJavaTime() 694 // [3] See base::Time::ToJavaTime()
677 // [4] See MediaKeySession::expirationChanged() 695 // [4] See MediaKeySession::expirationChanged()
678 // [5] https://github.com/w3c/encrypted-media/issues/58 696 // [5] https://github.com/w3c/encrypted-media/issues/58
679 void MediaDrmBridge::OnSessionExpirationUpdate(JNIEnv* env, 697 void MediaDrmBridge::OnSessionExpirationUpdate(JNIEnv* env,
680 jobject j_media_drm, 698 jobject j_media_drm,
681 jbyteArray j_session_id, 699 jbyteArray j_session_id,
682 jlong expiry_time_ms) { 700 jlong expiry_time_ms) {
683 DVLOG(2) << __FUNCTION__ << ": " << expiry_time_ms << " ms"; 701 DVLOG(2) << __FUNCTION__ << ": " << expiry_time_ms << " ms";
684 session_expiration_update_cb_.Run( 702 session_expiration_update_cb_.Run(
685 GetSessionId(env, j_session_id), 703 AsString(env, j_session_id),
686 base::Time::FromDoubleT(expiry_time_ms / 1000.0)); 704 base::Time::FromDoubleT(expiry_time_ms / 1000.0));
687 } 705 }
688 706
689 void MediaDrmBridge::OnLegacySessionError(JNIEnv* env, 707 void MediaDrmBridge::OnLegacySessionError(JNIEnv* env,
690 jobject j_media_drm, 708 jobject j_media_drm,
691 jbyteArray j_session_id, 709 jbyteArray j_session_id,
692 jstring j_error_message) { 710 jstring j_error_message) {
693 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message); 711 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message);
694 712
695 DVLOG(2) << __FUNCTION__ << ": " << error_message; 713 DVLOG(2) << __FUNCTION__ << ": " << error_message;
696 714
697 task_runner_->PostTask( 715 task_runner_->PostTask(
698 FROM_HERE, 716 FROM_HERE,
699 base::Bind(legacy_session_error_cb_, GetSessionId(env, j_session_id), 717 base::Bind(legacy_session_error_cb_, AsString(env, j_session_id),
700 MediaKeys::UNKNOWN_ERROR, 0, error_message)); 718 MediaKeys::UNKNOWN_ERROR, 0, error_message));
701 } 719 }
702 720
703 void MediaDrmBridge::OnResetDeviceCredentialsCompleted(JNIEnv* env, 721 void MediaDrmBridge::OnResetDeviceCredentialsCompleted(JNIEnv* env,
704 jobject, 722 jobject,
705 bool success) { 723 bool success) {
706 DVLOG(2) << __FUNCTION__ << ": " << success; 724 DVLOG(2) << __FUNCTION__ << ": " << success;
707 DCHECK(!reset_credentials_cb_.is_null()); 725 DCHECK(!reset_credentials_cb_.is_null());
708 task_runner_->PostTask( 726 task_runner_->PostTask(
709 FROM_HERE, 727 FROM_HERE,
710 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success)); 728 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success));
711 } 729 }
712 730
713 // The following are private methods. 731 // The following are private methods.
714 732
715 MediaDrmBridge::MediaDrmBridge( 733 MediaDrmBridge::MediaDrmBridge(
716 const std::vector<uint8>& scheme_uuid, 734 const std::vector<uint8>& scheme_uuid,
735 scoped_ptr<ProvisionFetcher> provision_fetcher,
717 const SessionMessageCB& session_message_cb, 736 const SessionMessageCB& session_message_cb,
718 const SessionClosedCB& session_closed_cb, 737 const SessionClosedCB& session_closed_cb,
719 const LegacySessionErrorCB& legacy_session_error_cb, 738 const LegacySessionErrorCB& legacy_session_error_cb,
720 const SessionKeysChangeCB& session_keys_change_cb, 739 const SessionKeysChangeCB& session_keys_change_cb,
721 const SessionExpirationUpdateCB& session_expiration_update_cb) 740 const SessionExpirationUpdateCB& session_expiration_update_cb)
722 : scheme_uuid_(scheme_uuid), 741 : scheme_uuid_(scheme_uuid),
742 provision_fetcher_(provision_fetcher.Pass()),
723 session_message_cb_(session_message_cb), 743 session_message_cb_(session_message_cb),
724 session_closed_cb_(session_closed_cb), 744 session_closed_cb_(session_closed_cb),
725 legacy_session_error_cb_(legacy_session_error_cb), 745 legacy_session_error_cb_(legacy_session_error_cb),
726 session_keys_change_cb_(session_keys_change_cb), 746 session_keys_change_cb_(session_keys_change_cb),
727 session_expiration_update_cb_(session_expiration_update_cb), 747 session_expiration_update_cb_(session_expiration_update_cb),
728 cdm_promise_adapter_(new CdmPromiseAdapter()), 748 cdm_promise_adapter_(new CdmPromiseAdapter()),
729 task_runner_(base::ThreadTaskRunnerHandle::Get()), 749 task_runner_(base::ThreadTaskRunnerHandle::Get()),
730 use_media_thread_(UseMediaThreadForMediaPlayback()), 750 use_media_thread_(UseMediaThreadForMediaPlayback()),
731 media_weak_factory_(this), 751 media_weak_factory_(this),
732 weak_factory_(this) { 752 weak_factory_(this) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
779 DCHECK(!GetMediaCrypto().is_null()); 799 DCHECK(!GetMediaCrypto().is_null());
780 800
781 // We can use scoped_ptr to pass ScopedJavaGlobalRef with a callback. 801 // We can use scoped_ptr to pass ScopedJavaGlobalRef with a callback.
782 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr( 802 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr(
783 new ScopedJavaGlobalRef<jobject>()); 803 new ScopedJavaGlobalRef<jobject>());
784 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj()); 804 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj());
785 805
786 cb.Run(j_object_ptr.Pass(), IsProtectedSurfaceRequired()); 806 cb.Run(j_object_ptr.Pass(), IsProtectedSurfaceRequired());
787 } 807 }
788 808
809 void MediaDrmBridge::SendProvisioningRequest(const std::string& default_url,
810 const std::string& request_data) {
811 DVLOG(1) << __FUNCTION__ << " default_url:" << default_url;
812
813 provision_fetcher_->Retrieve(
qinmin 2015/11/02 19:39:14 Is it ok to use the UI thread for network request?
Tima Vaisburd 2015/11/05 02:24:07 I think URLFetcher::Start() does it by itself: htt
814 default_url, request_data,
815 BindToCurrentLoop(
816 base::Bind(&MediaDrmBridge::ProcessProvisioningResult, WeakPtr())));
817 }
818
819 void MediaDrmBridge::ProcessProvisioningResult(const std::string& response,
xhwang 2015/11/02 20:37:05 nit: s/ProvisioningResult/ProvisionResponse
Tima Vaisburd 2015/11/05 02:24:07 Done.
820 bool success) {
821 DVLOG(1) << __FUNCTION__;
822
823 if (!success) {
824 VLOG(1) << "Device provision failure: can't get server response";
825 return;
826 }
827
828 JNIEnv* env = AttachCurrentThread();
829
830 ScopedJavaLocalRef<jbyteArray> j_response = base::android::ToJavaByteArray(
831 env, (uint8_t*)response.data(), response.size());
832
833 bool is_response_accepted = Java_MediaDrmBridge_provideProvisionResponse(
834 env, j_media_drm_.obj(), j_response.obj());
835
836 DVLOG(1) << __FUNCTION__ << ": provideProvisionResponse returned "
837 << is_response_accepted;
838
839 if (!reset_credentials_cb_.is_null()) {
xhwang 2015/11/02 20:37:05 We can also fire reset_credentials_cb_ in OnResetD
Tima Vaisburd 2015/11/05 02:24:07 Done.
840 base::ResetAndReturn(&reset_credentials_cb_).Run(is_response_accepted);
841 return;
842 }
843
844 if (is_response_accepted) {
845 Java_MediaDrmBridge_processPendingCreateSessionData(env,
846 j_media_drm_.obj());
847 }
848 }
849
789 } // namespace media 850 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698