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

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: Reformatted media/ 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
« no previous file with comments | « media/base/android/media_drm_bridge.h ('k') | media/base/android/media_drm_bridge_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/provision_fetcher.h"
28 #include "media/base/cdm_key_information.h" 29 #include "media/base/cdm_key_information.h"
29 30
30 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 31 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
31 32
32 using base::android::AttachCurrentThread; 33 using base::android::AttachCurrentThread;
33 using base::android::ConvertUTF8ToJavaString; 34 using base::android::ConvertUTF8ToJavaString;
34 using base::android::ConvertJavaStringToUTF8; 35 using base::android::ConvertJavaStringToUTF8;
35 using base::android::JavaByteArrayToByteVector; 36 using base::android::JavaByteArrayToByteVector;
36 using base::android::ScopedJavaGlobalRef; 37 using base::android::ScopedJavaGlobalRef;
37 using base::android::ScopedJavaLocalRef; 38 using base::android::ScopedJavaLocalRef;
(...skipping 13 matching lines...) Expand all
51 // These must be in sync with Android MediaDrm KEY_STATUS_XXX constants: 52 // These must be in sync with Android MediaDrm KEY_STATUS_XXX constants:
52 // https://developer.android.com/reference/android/media/MediaDrm.KeyStatus.html 53 // https://developer.android.com/reference/android/media/MediaDrm.KeyStatus.html
53 enum class KeyStatus { 54 enum class KeyStatus {
54 KEY_STATUS_USABLE = 0, 55 KEY_STATUS_USABLE = 0,
55 KEY_STATUS_EXPIRED = 1, 56 KEY_STATUS_EXPIRED = 1,
56 KEY_STATUS_OUTPUT_NOT_ALLOWED = 2, 57 KEY_STATUS_OUTPUT_NOT_ALLOWED = 2,
57 KEY_STATUS_PENDING = 3, 58 KEY_STATUS_PENDING = 3,
58 KEY_STATUS_INTERNAL_ERROR = 4, 59 KEY_STATUS_INTERNAL_ERROR = 4,
59 }; 60 };
60 61
61 // Returns string session ID from jbyteArray (byte[] in Java). 62 // Converts jbyteArray (byte[] in Java) into std::string.
62 std::string GetSessionId(JNIEnv* env, jbyteArray j_session_id) { 63 std::string AsString(JNIEnv* env, jbyteArray j_byte_array) {
63 std::vector<uint8> session_id_vector; 64 std::vector<uint8_t> byte_vector;
64 JavaByteArrayToByteVector(env, j_session_id, &session_id_vector); 65 JavaByteArrayToByteVector(env, j_byte_array, &byte_vector);
65 return std::string(session_id_vector.begin(), session_id_vector.end()); 66 return std::string(byte_vector.begin(), byte_vector.end());
66 } 67 }
67 68
68 const uint8 kWidevineUuid[16] = { 69 const uint8 kWidevineUuid[16] = {
69 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, // 70 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, //
70 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED}; 71 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED};
71 72
72 // Convert |init_data_type| to a string supported by MediaDRM. 73 // Convert |init_data_type| to a string supported by MediaDRM.
73 // "audio"/"video" does not matter, so use "video". 74 // "audio"/"video" does not matter, so use "video".
74 std::string ConvertInitDataType(media::EmeInitDataType init_data_type) { 75 std::string ConvertInitDataType(media::EmeInitDataType init_data_type) {
75 // TODO(jrummell/xhwang): EME init data types like "webm" and "cenc" are 76 // TODO(jrummell/xhwang): EME init data types like "webm" and "cenc" are
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 } 250 }
250 251
251 // static 252 // static
252 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() { 253 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() {
253 return g_key_system_manager.Get().GetPlatformKeySystemNames(); 254 return g_key_system_manager.Get().GetPlatformKeySystemNames();
254 } 255 }
255 256
256 // static 257 // static
257 scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( 258 scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create(
258 const std::string& key_system, 259 const std::string& key_system,
260 scoped_ptr<ProvisionFetcher> provision_fetcher,
259 const SessionMessageCB& session_message_cb, 261 const SessionMessageCB& session_message_cb,
260 const SessionClosedCB& session_closed_cb, 262 const SessionClosedCB& session_closed_cb,
261 const LegacySessionErrorCB& legacy_session_error_cb, 263 const LegacySessionErrorCB& legacy_session_error_cb,
262 const SessionKeysChangeCB& session_keys_change_cb, 264 const SessionKeysChangeCB& session_keys_change_cb,
263 const SessionExpirationUpdateCB& session_expiration_update_cb) { 265 const SessionExpirationUpdateCB& session_expiration_update_cb) {
264 DVLOG(1) << __FUNCTION__; 266 DVLOG(1) << __FUNCTION__;
265 267
266 if (!IsAvailable()) 268 if (!IsAvailable())
267 return nullptr; 269 return nullptr;
268 270
269 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); 271 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system);
270 if (scheme_uuid.empty()) 272 if (scheme_uuid.empty())
271 return nullptr; 273 return nullptr;
272 274
273 scoped_refptr<MediaDrmBridge> media_drm_bridge( 275 scoped_refptr<MediaDrmBridge> media_drm_bridge(new MediaDrmBridge(
274 new MediaDrmBridge(scheme_uuid, session_message_cb, session_closed_cb, 276 scheme_uuid, provision_fetcher.Pass(), session_message_cb,
275 legacy_session_error_cb, session_keys_change_cb, 277 session_closed_cb, legacy_session_error_cb, session_keys_change_cb,
276 session_expiration_update_cb)); 278 session_expiration_update_cb));
277 279
278 if (media_drm_bridge->j_media_drm_.is_null()) 280 if (media_drm_bridge->j_media_drm_.is_null())
279 media_drm_bridge = nullptr; 281 media_drm_bridge = nullptr;
280 282
281 return media_drm_bridge; 283 return media_drm_bridge;
282 } 284 }
283 285
284 // static 286 // static
285 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( 287 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport(
286 const std::string& key_system) { 288 const std::string& key_system,
287 return MediaDrmBridge::Create( 289 scoped_ptr<ProvisionFetcher> provision_fetcher) {
288 key_system, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(), 290 return MediaDrmBridge::Create(key_system, provision_fetcher.Pass(),
289 SessionKeysChangeCB(), SessionExpirationUpdateCB()); 291 SessionMessageCB(), SessionClosedCB(),
292 LegacySessionErrorCB(), SessionKeysChangeCB(),
293 SessionExpirationUpdateCB());
290 } 294 }
291 295
292 void MediaDrmBridge::SetServerCertificate( 296 void MediaDrmBridge::SetServerCertificate(
293 const std::vector<uint8_t>& certificate, 297 const std::vector<uint8_t>& certificate,
294 scoped_ptr<media::SimpleCdmPromise> promise) { 298 scoped_ptr<media::SimpleCdmPromise> promise) {
295 DVLOG(2) << __FUNCTION__; 299 DVLOG(2) << __FUNCTION__;
296 300
297 DCHECK(!certificate.empty()); 301 DCHECK(!certificate.empty());
298 302
299 JNIEnv* env = AttachCurrentThread(); 303 JNIEnv* env = AttachCurrentThread();
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 // For Widevine, this depends on the security level. 460 // For Widevine, this depends on the security level.
457 if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) 461 if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid))
458 return IsSecureDecoderRequired(GetSecurityLevel()); 462 return IsSecureDecoderRequired(GetSecurityLevel());
459 463
460 // For other key systems, assume true. 464 // For other key systems, assume true.
461 return true; 465 return true;
462 } 466 }
463 467
464 void MediaDrmBridge::ResetDeviceCredentials( 468 void MediaDrmBridge::ResetDeviceCredentials(
465 const ResetCredentialsCB& callback) { 469 const ResetCredentialsCB& callback) {
470 DVLOG(1) << __FUNCTION__;
471
466 DCHECK(reset_credentials_cb_.is_null()); 472 DCHECK(reset_credentials_cb_.is_null());
467 reset_credentials_cb_ = callback; 473 reset_credentials_cb_ = callback;
468 JNIEnv* env = AttachCurrentThread(); 474 JNIEnv* env = AttachCurrentThread();
469 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj()); 475 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj());
470 } 476 }
471 477
472 void MediaDrmBridge::ResolvePromise(uint32_t promise_id) { 478 void MediaDrmBridge::ResolvePromise(uint32_t promise_id) {
473 DVLOG(2) << __FUNCTION__; 479 DVLOG(2) << __FUNCTION__;
474 cdm_promise_adapter_->ResolvePromise(promise_id); 480 cdm_promise_adapter_->ResolvePromise(promise_id);
475 } 481 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 538
533 if (media_crypto_ready_cb_.is_null()) 539 if (media_crypto_ready_cb_.is_null())
534 return; 540 return;
535 541
536 task_runner_->PostTask( 542 task_runner_->PostTask(
537 FROM_HERE, base::Bind(&MediaDrmBridge::NotifyMediaCryptoReady, 543 FROM_HERE, base::Bind(&MediaDrmBridge::NotifyMediaCryptoReady,
538 weak_factory_.GetWeakPtr(), 544 weak_factory_.GetWeakPtr(),
539 base::ResetAndReturn(&media_crypto_ready_cb_))); 545 base::ResetAndReturn(&media_crypto_ready_cb_)));
540 } 546 }
541 547
548 void MediaDrmBridge::OnStartProvisioning(JNIEnv* env,
549 jobject j_media_drm,
550 jstring j_default_url,
551 jbyteArray j_request_data) {
552 DVLOG(1) << __FUNCTION__;
553
554 task_runner_->PostTask(FROM_HERE,
555 base::Bind(&MediaDrmBridge::SendProvisioningRequest,
556 weak_factory_.GetWeakPtr(),
557 ConvertJavaStringToUTF8(env, j_default_url),
558 AsString(env, j_request_data)));
559 }
560
542 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env, 561 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env,
543 jobject j_media_drm, 562 jobject j_media_drm,
544 jint j_promise_id) { 563 jint j_promise_id) {
545 task_runner_->PostTask(FROM_HERE, 564 task_runner_->PostTask(FROM_HERE,
546 base::Bind(&MediaDrmBridge::ResolvePromise, 565 base::Bind(&MediaDrmBridge::ResolvePromise,
547 weak_factory_.GetWeakPtr(), j_promise_id)); 566 weak_factory_.GetWeakPtr(), j_promise_id));
548 } 567 }
549 568
550 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env, 569 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env,
551 jobject j_media_drm, 570 jobject j_media_drm,
552 jint j_promise_id, 571 jint j_promise_id,
553 jbyteArray j_session_id) { 572 jbyteArray j_session_id) {
554 task_runner_->PostTask(FROM_HERE, 573 task_runner_->PostTask(FROM_HERE,
555 base::Bind(&MediaDrmBridge::ResolvePromiseWithSession, 574 base::Bind(&MediaDrmBridge::ResolvePromiseWithSession,
556 weak_factory_.GetWeakPtr(), j_promise_id, 575 weak_factory_.GetWeakPtr(), j_promise_id,
557 GetSessionId(env, j_session_id))); 576 AsString(env, j_session_id)));
558 } 577 }
559 578
560 void MediaDrmBridge::OnPromiseRejected(JNIEnv* env, 579 void MediaDrmBridge::OnPromiseRejected(JNIEnv* env,
561 jobject j_media_drm, 580 jobject j_media_drm,
562 jint j_promise_id, 581 jint j_promise_id,
563 jstring j_error_message) { 582 jstring j_error_message) {
564 task_runner_->PostTask( 583 task_runner_->PostTask(
565 FROM_HERE, 584 FROM_HERE,
566 base::Bind(&MediaDrmBridge::RejectPromise, weak_factory_.GetWeakPtr(), 585 base::Bind(&MediaDrmBridge::RejectPromise, weak_factory_.GetWeakPtr(),
567 j_promise_id, ConvertJavaStringToUTF8(env, j_error_message))); 586 j_promise_id, ConvertJavaStringToUTF8(env, j_error_message)));
568 } 587 }
569 588
570 void MediaDrmBridge::OnSessionMessage(JNIEnv* env, 589 void MediaDrmBridge::OnSessionMessage(JNIEnv* env,
571 jobject j_media_drm, 590 jobject j_media_drm,
572 jbyteArray j_session_id, 591 jbyteArray j_session_id,
573 jint j_message_type, 592 jint j_message_type,
574 jbyteArray j_message, 593 jbyteArray j_message,
575 jstring j_legacy_destination_url) { 594 jstring j_legacy_destination_url) {
576 DVLOG(2) << __FUNCTION__; 595 DVLOG(2) << __FUNCTION__;
577 596
578 std::vector<uint8> message; 597 std::vector<uint8> message;
579 JavaByteArrayToByteVector(env, j_message, &message); 598 JavaByteArrayToByteVector(env, j_message, &message);
580 GURL legacy_destination_url = 599 GURL legacy_destination_url =
581 GURL(ConvertJavaStringToUTF8(env, j_legacy_destination_url)); 600 GURL(ConvertJavaStringToUTF8(env, j_legacy_destination_url));
582 MediaKeys::MessageType message_type = 601 MediaKeys::MessageType message_type =
583 GetMessageType(static_cast<RequestType>(j_message_type)); 602 GetMessageType(static_cast<RequestType>(j_message_type));
584 603
585 task_runner_->PostTask( 604 task_runner_->PostTask(
586 FROM_HERE, 605 FROM_HERE, base::Bind(session_message_cb_, AsString(env, j_session_id),
587 base::Bind(session_message_cb_, GetSessionId(env, j_session_id), 606 message_type, message, legacy_destination_url));
588 message_type, message, legacy_destination_url));
589 } 607 }
590 608
591 void MediaDrmBridge::OnSessionClosed(JNIEnv* env, 609 void MediaDrmBridge::OnSessionClosed(JNIEnv* env,
592 jobject j_media_drm, 610 jobject j_media_drm,
593 jbyteArray j_session_id) { 611 jbyteArray j_session_id) {
594 DVLOG(2) << __FUNCTION__; 612 DVLOG(2) << __FUNCTION__;
595 std::string session_id = GetSessionId(env, j_session_id); 613 std::string session_id = AsString(env, j_session_id);
596 task_runner_->PostTask(FROM_HERE, base::Bind(session_closed_cb_, session_id)); 614 task_runner_->PostTask(FROM_HERE, base::Bind(session_closed_cb_, session_id));
597 } 615 }
598 616
599 void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env, 617 void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env,
600 jobject j_media_drm, 618 jobject j_media_drm,
601 jbyteArray j_session_id, 619 jbyteArray j_session_id,
602 jobjectArray j_keys_info, 620 jobjectArray j_keys_info,
603 bool has_additional_usable_key) { 621 bool has_additional_usable_key) {
604 DVLOG(2) << __FUNCTION__; 622 DVLOG(2) << __FUNCTION__;
605 623
(...skipping 21 matching lines...) Expand all
627 645
628 DVLOG(2) << __FUNCTION__ << "Key status change: " 646 DVLOG(2) << __FUNCTION__ << "Key status change: "
629 << base::HexEncode(&key_id[0], key_id.size()) << ", " 647 << base::HexEncode(&key_id[0], key_id.size()) << ", "
630 << key_status; 648 << key_status;
631 649
632 cdm_keys_info.push_back(new CdmKeyInformation(key_id, key_status, 0)); 650 cdm_keys_info.push_back(new CdmKeyInformation(key_id, key_status, 0));
633 } 651 }
634 652
635 task_runner_->PostTask( 653 task_runner_->PostTask(
636 FROM_HERE, 654 FROM_HERE,
637 base::Bind(session_keys_change_cb_, GetSessionId(env, j_session_id), 655 base::Bind(session_keys_change_cb_, AsString(env, j_session_id),
638 has_additional_usable_key, base::Passed(&cdm_keys_info))); 656 has_additional_usable_key, base::Passed(&cdm_keys_info)));
639 } 657 }
640 658
641 // According to MeidaDrm documentation [1], zero |expiry_time_ms| means the keys 659 // According to MeidaDrm documentation [1], zero |expiry_time_ms| means the keys
642 // will never expire. This will be translated into a NULL base::Time() [2], 660 // will never expire. This will be translated into a NULL base::Time() [2],
643 // which will then be mapped to a zero Java time [3]. The zero Java time is 661 // which will then be mapped to a zero Java time [3]. The zero Java time is
644 // passed to Blink which will then be translated to NaN [4], which is what the 662 // passed to Blink which will then be translated to NaN [4], which is what the
645 // spec uses to indicate that the license will never expire [5]. 663 // spec uses to indicate that the license will never expire [5].
646 // [1] 664 // [1]
647 // http://developer.android.com/reference/android/media/MediaDrm.OnExpirationUpd ateListener.html 665 // http://developer.android.com/reference/android/media/MediaDrm.OnExpirationUpd ateListener.html
648 // [2] See base::Time::FromDoubleT() 666 // [2] See base::Time::FromDoubleT()
649 // [3] See base::Time::ToJavaTime() 667 // [3] See base::Time::ToJavaTime()
650 // [4] See MediaKeySession::expirationChanged() 668 // [4] See MediaKeySession::expirationChanged()
651 // [5] https://github.com/w3c/encrypted-media/issues/58 669 // [5] https://github.com/w3c/encrypted-media/issues/58
652 void MediaDrmBridge::OnSessionExpirationUpdate(JNIEnv* env, 670 void MediaDrmBridge::OnSessionExpirationUpdate(JNIEnv* env,
653 jobject j_media_drm, 671 jobject j_media_drm,
654 jbyteArray j_session_id, 672 jbyteArray j_session_id,
655 jlong expiry_time_ms) { 673 jlong expiry_time_ms) {
656 DVLOG(2) << __FUNCTION__ << ": " << expiry_time_ms << " ms"; 674 DVLOG(2) << __FUNCTION__ << ": " << expiry_time_ms << " ms";
657 session_expiration_update_cb_.Run( 675 session_expiration_update_cb_.Run(
658 GetSessionId(env, j_session_id), 676 AsString(env, j_session_id),
659 base::Time::FromDoubleT(expiry_time_ms / 1000.0)); 677 base::Time::FromDoubleT(expiry_time_ms / 1000.0));
660 } 678 }
661 679
662 void MediaDrmBridge::OnLegacySessionError(JNIEnv* env, 680 void MediaDrmBridge::OnLegacySessionError(JNIEnv* env,
663 jobject j_media_drm, 681 jobject j_media_drm,
664 jbyteArray j_session_id, 682 jbyteArray j_session_id,
665 jstring j_error_message) { 683 jstring j_error_message) {
666 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message); 684 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message);
667 685
668 DVLOG(2) << __FUNCTION__ << ": " << error_message; 686 DVLOG(2) << __FUNCTION__ << ": " << error_message;
669 687
670 task_runner_->PostTask( 688 task_runner_->PostTask(
671 FROM_HERE, 689 FROM_HERE,
672 base::Bind(legacy_session_error_cb_, GetSessionId(env, j_session_id), 690 base::Bind(legacy_session_error_cb_, AsString(env, j_session_id),
673 MediaKeys::UNKNOWN_ERROR, 0, error_message)); 691 MediaKeys::UNKNOWN_ERROR, 0, error_message));
674 } 692 }
675 693
676 void MediaDrmBridge::OnResetDeviceCredentialsCompleted(JNIEnv* env, 694 void MediaDrmBridge::OnResetDeviceCredentialsCompleted(JNIEnv* env,
677 jobject, 695 jobject,
678 bool success) { 696 bool success) {
679 DVLOG(2) << __FUNCTION__ << ": " << success; 697 DVLOG(2) << __FUNCTION__ << ": success:" << success;
680 DCHECK(!reset_credentials_cb_.is_null()); 698 DCHECK(!reset_credentials_cb_.is_null());
681 task_runner_->PostTask( 699 task_runner_->PostTask(
682 FROM_HERE, 700 FROM_HERE,
683 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success)); 701 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success));
684 } 702 }
685 703
686 // The following are private methods. 704 // The following are private methods.
687 705
688 MediaDrmBridge::MediaDrmBridge( 706 MediaDrmBridge::MediaDrmBridge(
689 const std::vector<uint8>& scheme_uuid, 707 const std::vector<uint8>& scheme_uuid,
708 scoped_ptr<ProvisionFetcher> provision_fetcher,
690 const SessionMessageCB& session_message_cb, 709 const SessionMessageCB& session_message_cb,
691 const SessionClosedCB& session_closed_cb, 710 const SessionClosedCB& session_closed_cb,
692 const LegacySessionErrorCB& legacy_session_error_cb, 711 const LegacySessionErrorCB& legacy_session_error_cb,
693 const SessionKeysChangeCB& session_keys_change_cb, 712 const SessionKeysChangeCB& session_keys_change_cb,
694 const SessionExpirationUpdateCB& session_expiration_update_cb) 713 const SessionExpirationUpdateCB& session_expiration_update_cb)
695 : scheme_uuid_(scheme_uuid), 714 : scheme_uuid_(scheme_uuid),
715 provision_fetcher_(provision_fetcher.Pass()),
696 session_message_cb_(session_message_cb), 716 session_message_cb_(session_message_cb),
697 session_closed_cb_(session_closed_cb), 717 session_closed_cb_(session_closed_cb),
698 legacy_session_error_cb_(legacy_session_error_cb), 718 legacy_session_error_cb_(legacy_session_error_cb),
699 session_keys_change_cb_(session_keys_change_cb), 719 session_keys_change_cb_(session_keys_change_cb),
700 session_expiration_update_cb_(session_expiration_update_cb), 720 session_expiration_update_cb_(session_expiration_update_cb),
701 cdm_promise_adapter_(new CdmPromiseAdapter()), 721 cdm_promise_adapter_(new CdmPromiseAdapter()),
702 task_runner_(base::ThreadTaskRunnerHandle::Get()), 722 task_runner_(base::ThreadTaskRunnerHandle::Get()),
703 weak_factory_(this) { 723 weak_factory_(this) {
704 DVLOG(1) << __FUNCTION__; 724 DVLOG(1) << __FUNCTION__;
705 725
726 DCHECK(provision_fetcher_);
727
706 JNIEnv* env = AttachCurrentThread(); 728 JNIEnv* env = AttachCurrentThread();
707 CHECK(env); 729 CHECK(env);
708 730
709 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = 731 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid =
710 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); 732 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size());
711 j_media_drm_.Reset(Java_MediaDrmBridge_create( 733 j_media_drm_.Reset(Java_MediaDrmBridge_create(
712 env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this))); 734 env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this)));
713 } 735 }
714 736
715 MediaDrmBridge::~MediaDrmBridge() { 737 MediaDrmBridge::~MediaDrmBridge() {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 DCHECK(!GetMediaCrypto().is_null()); 771 DCHECK(!GetMediaCrypto().is_null());
750 772
751 // We can use scoped_ptr to pass ScopedJavaGlobalRef with a callback. 773 // We can use scoped_ptr to pass ScopedJavaGlobalRef with a callback.
752 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr( 774 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr(
753 new ScopedJavaGlobalRef<jobject>()); 775 new ScopedJavaGlobalRef<jobject>());
754 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj()); 776 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj());
755 777
756 cb.Run(j_object_ptr.Pass(), IsProtectedSurfaceRequired()); 778 cb.Run(j_object_ptr.Pass(), IsProtectedSurfaceRequired());
757 } 779 }
758 780
781 void MediaDrmBridge::SendProvisioningRequest(const std::string& default_url,
782 const std::string& request_data) {
783 DVLOG(1) << __FUNCTION__;
784
785 provision_fetcher_->Retrieve(
786 default_url, request_data,
787 base::Bind(&MediaDrmBridge::ProcessProvisionResponse,
788 weak_factory_.GetWeakPtr()));
789 }
790
791 void MediaDrmBridge::ProcessProvisionResponse(bool success,
792 const std::string& response) {
793 DVLOG(1) << __FUNCTION__;
794
795 if (!success)
796 VLOG(1) << "Device provision failure: can't get server response";
797
798 JNIEnv* env = AttachCurrentThread();
799
800 ScopedJavaLocalRef<jbyteArray> j_response = base::android::ToJavaByteArray(
801 env, reinterpret_cast<const uint8_t*>(response.data()), response.size());
802
803 Java_MediaDrmBridge_processProvisionResponse(env, j_media_drm_.obj(), success,
804 j_response.obj());
805 }
806
759 } // namespace media 807 } // namespace media
OLDNEW
« no previous file with comments | « media/base/android/media_drm_bridge.h ('k') | media/base/android/media_drm_bridge_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698