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 |