OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |