| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 278 return g_key_system_manager.Get().GetPlatformKeySystemNames(); | 278 return g_key_system_manager.Get().GetPlatformKeySystemNames(); |
| 279 } | 279 } |
| 280 | 280 |
| 281 // static | 281 // static |
| 282 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateInternal( | 282 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateInternal( |
| 283 const std::string& key_system, | 283 const std::string& key_system, |
| 284 SecurityLevel security_level, | 284 SecurityLevel security_level, |
| 285 const CreateFetcherCB& create_fetcher_cb, | 285 const CreateFetcherCB& create_fetcher_cb, |
| 286 const SessionMessageCB& session_message_cb, | 286 const SessionMessageCB& session_message_cb, |
| 287 const SessionClosedCB& session_closed_cb, | 287 const SessionClosedCB& session_closed_cb, |
| 288 const LegacySessionErrorCB& legacy_session_error_cb, | |
| 289 const SessionKeysChangeCB& session_keys_change_cb, | 288 const SessionKeysChangeCB& session_keys_change_cb, |
| 290 const SessionExpirationUpdateCB& session_expiration_update_cb) { | 289 const SessionExpirationUpdateCB& session_expiration_update_cb) { |
| 291 // All paths requires the MediaDrmApis. | 290 // All paths requires the MediaDrmApis. |
| 292 DCHECK(AreMediaDrmApisAvailable()); | 291 DCHECK(AreMediaDrmApisAvailable()); |
| 293 | 292 |
| 294 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); | 293 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); |
| 295 if (scheme_uuid.empty()) | 294 if (scheme_uuid.empty()) |
| 296 return nullptr; | 295 return nullptr; |
| 297 | 296 |
| 298 scoped_refptr<MediaDrmBridge> media_drm_bridge(new MediaDrmBridge( | 297 scoped_refptr<MediaDrmBridge> media_drm_bridge(new MediaDrmBridge( |
| 299 scheme_uuid, security_level, create_fetcher_cb, session_message_cb, | 298 scheme_uuid, security_level, create_fetcher_cb, session_message_cb, |
| 300 session_closed_cb, legacy_session_error_cb, session_keys_change_cb, | 299 session_closed_cb, session_keys_change_cb, session_expiration_update_cb)); |
| 301 session_expiration_update_cb)); | |
| 302 | 300 |
| 303 if (media_drm_bridge->j_media_drm_.is_null()) | 301 if (media_drm_bridge->j_media_drm_.is_null()) |
| 304 media_drm_bridge = nullptr; | 302 media_drm_bridge = nullptr; |
| 305 | 303 |
| 306 return media_drm_bridge; | 304 return media_drm_bridge; |
| 307 } | 305 } |
| 308 | 306 |
| 309 // static | 307 // static |
| 310 scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( | 308 scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( |
| 311 const std::string& key_system, | 309 const std::string& key_system, |
| 312 SecurityLevel security_level, | 310 SecurityLevel security_level, |
| 313 const CreateFetcherCB& create_fetcher_cb, | 311 const CreateFetcherCB& create_fetcher_cb, |
| 314 const SessionMessageCB& session_message_cb, | 312 const SessionMessageCB& session_message_cb, |
| 315 const SessionClosedCB& session_closed_cb, | 313 const SessionClosedCB& session_closed_cb, |
| 316 const LegacySessionErrorCB& legacy_session_error_cb, | |
| 317 const SessionKeysChangeCB& session_keys_change_cb, | 314 const SessionKeysChangeCB& session_keys_change_cb, |
| 318 const SessionExpirationUpdateCB& session_expiration_update_cb) { | 315 const SessionExpirationUpdateCB& session_expiration_update_cb) { |
| 319 DVLOG(1) << __FUNCTION__; | 316 DVLOG(1) << __FUNCTION__; |
| 320 | 317 |
| 321 if (!IsAvailable()) | 318 if (!IsAvailable()) |
| 322 return nullptr; | 319 return nullptr; |
| 323 | 320 |
| 324 return CreateInternal(key_system, security_level, create_fetcher_cb, | 321 return CreateInternal(key_system, security_level, create_fetcher_cb, |
| 325 session_message_cb, session_closed_cb, | 322 session_message_cb, session_closed_cb, |
| 326 legacy_session_error_cb, session_keys_change_cb, | 323 session_keys_change_cb, session_expiration_update_cb); |
| 327 session_expiration_update_cb); | |
| 328 } | 324 } |
| 329 | 325 |
| 330 // static | 326 // static |
| 331 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( | 327 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( |
| 332 const std::string& key_system, | 328 const std::string& key_system, |
| 333 SecurityLevel security_level, | 329 SecurityLevel security_level, |
| 334 const CreateFetcherCB& create_fetcher_cb) { | 330 const CreateFetcherCB& create_fetcher_cb) { |
| 335 DVLOG(1) << __FUNCTION__; | 331 DVLOG(1) << __FUNCTION__; |
| 336 | 332 |
| 337 // Sessions won't be used so decoding capability is not required. | 333 // Sessions won't be used so decoding capability is not required. |
| 338 if (!AreMediaDrmApisAvailable()) | 334 if (!AreMediaDrmApisAvailable()) |
| 339 return nullptr; | 335 return nullptr; |
| 340 | 336 |
| 341 return MediaDrmBridge::Create(key_system, security_level, create_fetcher_cb, | 337 return MediaDrmBridge::Create( |
| 342 SessionMessageCB(), SessionClosedCB(), | 338 key_system, security_level, create_fetcher_cb, SessionMessageCB(), |
| 343 LegacySessionErrorCB(), SessionKeysChangeCB(), | 339 SessionClosedCB(), SessionKeysChangeCB(), SessionExpirationUpdateCB()); |
| 344 SessionExpirationUpdateCB()); | |
| 345 } | 340 } |
| 346 | 341 |
| 347 void MediaDrmBridge::SetServerCertificate( | 342 void MediaDrmBridge::SetServerCertificate( |
| 348 const std::vector<uint8_t>& certificate, | 343 const std::vector<uint8_t>& certificate, |
| 349 std::unique_ptr<media::SimpleCdmPromise> promise) { | 344 std::unique_ptr<media::SimpleCdmPromise> promise) { |
| 350 DCHECK(task_runner_->BelongsToCurrentThread()); | 345 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 351 DVLOG(2) << __FUNCTION__ << "(" << certificate.size() << " bytes)"; | 346 DVLOG(2) << __FUNCTION__ << "(" << certificate.size() << " bytes)"; |
| 352 | 347 |
| 353 DCHECK(!certificate.empty()); | 348 DCHECK(!certificate.empty()); |
| 354 | 349 |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 FROM_HERE, | 626 FROM_HERE, |
| 632 base::Bind(&MediaDrmBridge::RejectPromise, weak_factory_.GetWeakPtr(), | 627 base::Bind(&MediaDrmBridge::RejectPromise, weak_factory_.GetWeakPtr(), |
| 633 j_promise_id, ConvertJavaStringToUTF8(env, j_error_message))); | 628 j_promise_id, ConvertJavaStringToUTF8(env, j_error_message))); |
| 634 } | 629 } |
| 635 | 630 |
| 636 void MediaDrmBridge::OnSessionMessage( | 631 void MediaDrmBridge::OnSessionMessage( |
| 637 JNIEnv* env, | 632 JNIEnv* env, |
| 638 const JavaParamRef<jobject>& j_media_drm, | 633 const JavaParamRef<jobject>& j_media_drm, |
| 639 const JavaParamRef<jbyteArray>& j_session_id, | 634 const JavaParamRef<jbyteArray>& j_session_id, |
| 640 jint j_message_type, | 635 jint j_message_type, |
| 641 const JavaParamRef<jbyteArray>& j_message, | 636 const JavaParamRef<jbyteArray>& j_message) { |
| 642 const JavaParamRef<jstring>& j_legacy_destination_url) { | |
| 643 DVLOG(2) << __FUNCTION__; | 637 DVLOG(2) << __FUNCTION__; |
| 644 | 638 |
| 645 std::vector<uint8_t> message; | 639 std::vector<uint8_t> message; |
| 646 JavaByteArrayToByteVector(env, j_message, &message); | 640 JavaByteArrayToByteVector(env, j_message, &message); |
| 647 GURL legacy_destination_url = | |
| 648 GURL(ConvertJavaStringToUTF8(env, j_legacy_destination_url)); | |
| 649 MediaKeys::MessageType message_type = | 641 MediaKeys::MessageType message_type = |
| 650 GetMessageType(static_cast<RequestType>(j_message_type)); | 642 GetMessageType(static_cast<RequestType>(j_message_type)); |
| 651 | 643 |
| 652 task_runner_->PostTask( | 644 task_runner_->PostTask( |
| 653 FROM_HERE, base::Bind(session_message_cb_, AsString(env, j_session_id), | 645 FROM_HERE, base::Bind(session_message_cb_, AsString(env, j_session_id), |
| 654 message_type, message, legacy_destination_url)); | 646 message_type, message)); |
| 655 } | 647 } |
| 656 | 648 |
| 657 void MediaDrmBridge::OnSessionClosed( | 649 void MediaDrmBridge::OnSessionClosed( |
| 658 JNIEnv* env, | 650 JNIEnv* env, |
| 659 const JavaParamRef<jobject>& j_media_drm, | 651 const JavaParamRef<jobject>& j_media_drm, |
| 660 const JavaParamRef<jbyteArray>& j_session_id) { | 652 const JavaParamRef<jbyteArray>& j_session_id) { |
| 661 DVLOG(2) << __FUNCTION__; | 653 DVLOG(2) << __FUNCTION__; |
| 662 std::string session_id = AsString(env, j_session_id); | 654 std::string session_id = AsString(env, j_session_id); |
| 663 task_runner_->PostTask(FROM_HERE, base::Bind(session_closed_cb_, session_id)); | 655 task_runner_->PostTask(FROM_HERE, base::Bind(session_closed_cb_, session_id)); |
| 664 } | 656 } |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 725 const JavaParamRef<jobject>& j_media_drm, | 717 const JavaParamRef<jobject>& j_media_drm, |
| 726 const JavaParamRef<jbyteArray>& j_session_id, | 718 const JavaParamRef<jbyteArray>& j_session_id, |
| 727 jlong expiry_time_ms) { | 719 jlong expiry_time_ms) { |
| 728 DVLOG(2) << __FUNCTION__ << ": " << expiry_time_ms << " ms"; | 720 DVLOG(2) << __FUNCTION__ << ": " << expiry_time_ms << " ms"; |
| 729 task_runner_->PostTask( | 721 task_runner_->PostTask( |
| 730 FROM_HERE, | 722 FROM_HERE, |
| 731 base::Bind(session_expiration_update_cb_, AsString(env, j_session_id), | 723 base::Bind(session_expiration_update_cb_, AsString(env, j_session_id), |
| 732 base::Time::FromDoubleT(expiry_time_ms / 1000.0))); | 724 base::Time::FromDoubleT(expiry_time_ms / 1000.0))); |
| 733 } | 725 } |
| 734 | 726 |
| 735 void MediaDrmBridge::OnLegacySessionError( | |
| 736 JNIEnv* env, | |
| 737 const JavaParamRef<jobject>& j_media_drm, | |
| 738 const JavaParamRef<jbyteArray>& j_session_id, | |
| 739 const JavaParamRef<jstring>& j_error_message) { | |
| 740 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message); | |
| 741 | |
| 742 DVLOG(2) << __FUNCTION__ << ": " << error_message; | |
| 743 | |
| 744 task_runner_->PostTask( | |
| 745 FROM_HERE, | |
| 746 base::Bind(legacy_session_error_cb_, AsString(env, j_session_id), | |
| 747 MediaKeys::UNKNOWN_ERROR, 0, error_message)); | |
| 748 } | |
| 749 | |
| 750 void MediaDrmBridge::OnResetDeviceCredentialsCompleted( | 727 void MediaDrmBridge::OnResetDeviceCredentialsCompleted( |
| 751 JNIEnv* env, | 728 JNIEnv* env, |
| 752 const JavaParamRef<jobject>&, | 729 const JavaParamRef<jobject>&, |
| 753 bool success) { | 730 bool success) { |
| 754 DVLOG(2) << __FUNCTION__ << ": success:" << success; | 731 DVLOG(2) << __FUNCTION__ << ": success:" << success; |
| 755 DCHECK(!reset_credentials_cb_.is_null()); | 732 DCHECK(!reset_credentials_cb_.is_null()); |
| 756 task_runner_->PostTask( | 733 task_runner_->PostTask( |
| 757 FROM_HERE, | 734 FROM_HERE, |
| 758 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success)); | 735 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success)); |
| 759 } | 736 } |
| 760 | 737 |
| 761 //------------------------------------------------------------------------------ | 738 //------------------------------------------------------------------------------ |
| 762 // The following are private methods. | 739 // The following are private methods. |
| 763 | 740 |
| 764 MediaDrmBridge::MediaDrmBridge( | 741 MediaDrmBridge::MediaDrmBridge( |
| 765 const std::vector<uint8_t>& scheme_uuid, | 742 const std::vector<uint8_t>& scheme_uuid, |
| 766 SecurityLevel security_level, | 743 SecurityLevel security_level, |
| 767 const CreateFetcherCB& create_fetcher_cb, | 744 const CreateFetcherCB& create_fetcher_cb, |
| 768 const SessionMessageCB& session_message_cb, | 745 const SessionMessageCB& session_message_cb, |
| 769 const SessionClosedCB& session_closed_cb, | 746 const SessionClosedCB& session_closed_cb, |
| 770 const LegacySessionErrorCB& legacy_session_error_cb, | |
| 771 const SessionKeysChangeCB& session_keys_change_cb, | 747 const SessionKeysChangeCB& session_keys_change_cb, |
| 772 const SessionExpirationUpdateCB& session_expiration_update_cb) | 748 const SessionExpirationUpdateCB& session_expiration_update_cb) |
| 773 : scheme_uuid_(scheme_uuid), | 749 : scheme_uuid_(scheme_uuid), |
| 774 create_fetcher_cb_(create_fetcher_cb), | 750 create_fetcher_cb_(create_fetcher_cb), |
| 775 session_message_cb_(session_message_cb), | 751 session_message_cb_(session_message_cb), |
| 776 session_closed_cb_(session_closed_cb), | 752 session_closed_cb_(session_closed_cb), |
| 777 legacy_session_error_cb_(legacy_session_error_cb), | |
| 778 session_keys_change_cb_(session_keys_change_cb), | 753 session_keys_change_cb_(session_keys_change_cb), |
| 779 session_expiration_update_cb_(session_expiration_update_cb), | 754 session_expiration_update_cb_(session_expiration_update_cb), |
| 780 task_runner_(base::ThreadTaskRunnerHandle::Get()), | 755 task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 781 media_drm_bridge_cdm_context_(this), | 756 media_drm_bridge_cdm_context_(this), |
| 782 weak_factory_(this) { | 757 weak_factory_(this) { |
| 783 DVLOG(1) << __FUNCTION__; | 758 DVLOG(1) << __FUNCTION__; |
| 784 | 759 |
| 785 DCHECK(!create_fetcher_cb_.is_null()); | 760 DCHECK(!create_fetcher_cb_.is_null()); |
| 786 | 761 |
| 787 JNIEnv* env = AttachCurrentThread(); | 762 JNIEnv* env = AttachCurrentThread(); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 897 } | 872 } |
| 898 | 873 |
| 899 void MediaDrmBridge::OnHasAdditionalUsableKey() { | 874 void MediaDrmBridge::OnHasAdditionalUsableKey() { |
| 900 DCHECK(task_runner_->BelongsToCurrentThread()); | 875 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 901 DVLOG(1) << __FUNCTION__; | 876 DVLOG(1) << __FUNCTION__; |
| 902 | 877 |
| 903 player_tracker_.NotifyNewKey(); | 878 player_tracker_.NotifyNewKey(); |
| 904 } | 879 } |
| 905 | 880 |
| 906 } // namespace media | 881 } // namespace media |
| OLD | NEW |