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

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

Issue 2823513002: [Clank] Load origin id before create MediaDrmBridge (Closed)
Patch Set: Rebase Created 3 years, 5 months 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 <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 312
313 // static 313 // static
314 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() { 314 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() {
315 if (!MediaDrmBridge::IsAvailable()) 315 if (!MediaDrmBridge::IsAvailable())
316 return std::vector<std::string>(); 316 return std::vector<std::string>();
317 317
318 return GetKeySystemManager()->GetPlatformKeySystemNames(); 318 return GetKeySystemManager()->GetPlatformKeySystemNames();
319 } 319 }
320 320
321 // static 321 // static
322 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateInternal( 322 void MediaDrmBridge::CreateInternal(
323 const std::string& key_system, 323 const std::vector<uint8_t>& scheme_uuid,
324 const GURL& security_origin,
325 SecurityLevel security_level, 324 SecurityLevel security_level,
325 std::unique_ptr<MediaDrmStorageBridge> storage,
326 const CreateFetcherCB& create_fetcher_cb, 326 const CreateFetcherCB& create_fetcher_cb,
327 const CreateStorageCB& create_storage_cb,
328 const SessionMessageCB& session_message_cb, 327 const SessionMessageCB& session_message_cb,
329 const SessionClosedCB& session_closed_cb, 328 const SessionClosedCB& session_closed_cb,
330 const SessionKeysChangeCB& session_keys_change_cb, 329 const SessionKeysChangeCB& session_keys_change_cb,
331 const SessionExpirationUpdateCB& session_expiration_update_cb) { 330 const SessionExpirationUpdateCB& session_expiration_update_cb,
331 CreatedCB created_cb) {
332 // All paths requires the MediaDrmApis. 332 // All paths requires the MediaDrmApis.
333 DCHECK(AreMediaDrmApisAvailable()); 333 DCHECK(AreMediaDrmApisAvailable());
334 334 DCHECK(!scheme_uuid.empty());
335 UUID scheme_uuid = GetKeySystemManager()->GetUUID(key_system);
336 if (scheme_uuid.empty())
337 return nullptr;
338 335
339 scoped_refptr<MediaDrmBridge> media_drm_bridge(new MediaDrmBridge( 336 scoped_refptr<MediaDrmBridge> media_drm_bridge(new MediaDrmBridge(
340 scheme_uuid, security_origin, security_level, create_fetcher_cb, 337 scheme_uuid, security_level, std::move(storage), create_fetcher_cb,
341 create_storage_cb, session_message_cb, session_closed_cb, 338 session_message_cb, session_closed_cb, session_keys_change_cb,
342 session_keys_change_cb, session_expiration_update_cb)); 339 session_expiration_update_cb));
343 340
344 if (media_drm_bridge->j_media_drm_.is_null()) 341 if (media_drm_bridge->j_media_drm_.is_null())
345 media_drm_bridge = nullptr; 342 media_drm_bridge = nullptr;
346 343
347 return media_drm_bridge; 344 std::move(created_cb).Run(std::move(media_drm_bridge));
xhwang 2017/07/21 18:18:26 Add a comment why we want to return the CDM asynch
yucliu1 2017/07/21 20:24:09 Done.
348 } 345 }
349 346
350 // static 347 // static
351 scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( 348 void MediaDrmBridge::Create(
352 const std::string& key_system, 349 const std::string& key_system,
353 const GURL& security_origin, 350 const GURL& security_origin,
354 SecurityLevel security_level, 351 SecurityLevel security_level,
355 const CreateFetcherCB& create_fetcher_cb, 352 const CreateFetcherCB& create_fetcher_cb,
356 const CreateStorageCB& create_storage_cb, 353 const CreateStorageCB& create_storage_cb,
357 const SessionMessageCB& session_message_cb, 354 const SessionMessageCB& session_message_cb,
358 const SessionClosedCB& session_closed_cb, 355 const SessionClosedCB& session_closed_cb,
359 const SessionKeysChangeCB& session_keys_change_cb, 356 const SessionKeysChangeCB& session_keys_change_cb,
360 const SessionExpirationUpdateCB& session_expiration_update_cb) { 357 const SessionExpirationUpdateCB& session_expiration_update_cb,
358 CreatedCB created_cb) {
361 DVLOG(1) << __func__; 359 DVLOG(1) << __func__;
362 360
363 if (!IsAvailable()) 361 if (!IsAvailable()) {
364 return nullptr; 362 std::move(created_cb).Run(nullptr);
363 return;
364 }
365 365
366 return CreateInternal(key_system, security_origin, security_level, 366 UUID scheme_uuid = GetKeySystemManager()->GetUUID(key_system);
367 create_fetcher_cb, create_storage_cb, 367 if (scheme_uuid.empty()) {
368 session_message_cb, session_closed_cb, 368 std::move(created_cb).Run(nullptr);
369 session_keys_change_cb, session_expiration_update_cb); 369 return;
370 }
371
372 // MediaDrmStorage may be lazy created in MediaDrmStorageBridge.
373 auto storage = base::MakeUnique<MediaDrmStorageBridge>();
374 MediaDrmStorageBridge* raw_storage = storage.get();
375
376 base::OnceClosure create_media_drm_cb = base::BindOnce(
377 &MediaDrmBridge::CreateInternal, scheme_uuid, security_level,
378 base::Passed(&storage), create_fetcher_cb, session_message_cb,
379 session_closed_cb, session_keys_change_cb, session_expiration_update_cb,
380 base::Passed(&created_cb));
381
382 if (IsPersistentLicenseTypeSupported(key_system) &&
383 !security_origin.is_empty() && !create_storage_cb.is_null()) {
384 raw_storage->Initialize(url::Origin(security_origin), create_storage_cb,
385 std::move(create_media_drm_cb));
386 } else {
387 std::move(create_media_drm_cb).Run();
388 }
370 } 389 }
371 390
372 // static 391 // static
373 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( 392 void MediaDrmBridge::CreateWithoutSessionSupport(
374 const std::string& key_system, 393 const std::string& key_system,
375 SecurityLevel security_level, 394 SecurityLevel security_level,
376 const CreateFetcherCB& create_fetcher_cb) { 395 const CreateFetcherCB& create_fetcher_cb,
396 CreatedCB created_cb) {
377 DVLOG(1) << __func__; 397 DVLOG(1) << __func__;
378 398
379 // Sessions won't be used so decoding capability is not required. 399 // Sessions won't be used so decoding capability is not required.
380 if (!AreMediaDrmApisAvailable()) 400 if (!AreMediaDrmApisAvailable()) {
381 return nullptr; 401 std::move(created_cb).Run(nullptr);
402 return;
403 }
382 404
383 return MediaDrmBridge::Create( 405 MediaDrmBridge::Create(key_system, GURL::EmptyGURL(), security_level,
384 key_system, GURL::EmptyGURL(), security_level, create_fetcher_cb, 406 create_fetcher_cb, CreateStorageCB(),
385 CreateStorageCB(), SessionMessageCB(), SessionClosedCB(), 407 SessionMessageCB(), SessionClosedCB(),
386 SessionKeysChangeCB(), SessionExpirationUpdateCB()); 408 SessionKeysChangeCB(), SessionExpirationUpdateCB(),
409 std::move(created_cb));
387 } 410 }
388 411
389 void MediaDrmBridge::SetServerCertificate( 412 void MediaDrmBridge::SetServerCertificate(
390 const std::vector<uint8_t>& certificate, 413 const std::vector<uint8_t>& certificate,
391 std::unique_ptr<media::SimpleCdmPromise> promise) { 414 std::unique_ptr<media::SimpleCdmPromise> promise) {
392 DCHECK(task_runner_->BelongsToCurrentThread()); 415 DCHECK(task_runner_->BelongsToCurrentThread());
393 DVLOG(2) << __func__ << "(" << certificate.size() << " bytes)"; 416 DVLOG(2) << __func__ << "(" << certificate.size() << " bytes)";
394 417
395 DCHECK(!certificate.empty()); 418 DCHECK(!certificate.empty());
396 419
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 task_runner_->PostTask( 817 task_runner_->PostTask(
795 FROM_HERE, 818 FROM_HERE,
796 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success)); 819 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success));
797 } 820 }
798 821
799 //------------------------------------------------------------------------------ 822 //------------------------------------------------------------------------------
800 // The following are private methods. 823 // The following are private methods.
801 824
802 MediaDrmBridge::MediaDrmBridge( 825 MediaDrmBridge::MediaDrmBridge(
803 const std::vector<uint8_t>& scheme_uuid, 826 const std::vector<uint8_t>& scheme_uuid,
804 const GURL& security_origin,
805 SecurityLevel security_level, 827 SecurityLevel security_level,
828 std::unique_ptr<MediaDrmStorageBridge> storage,
806 const CreateFetcherCB& create_fetcher_cb, 829 const CreateFetcherCB& create_fetcher_cb,
807 const CreateStorageCB& create_storage_cb,
808 const SessionMessageCB& session_message_cb, 830 const SessionMessageCB& session_message_cb,
809 const SessionClosedCB& session_closed_cb, 831 const SessionClosedCB& session_closed_cb,
810 const SessionKeysChangeCB& session_keys_change_cb, 832 const SessionKeysChangeCB& session_keys_change_cb,
811 const SessionExpirationUpdateCB& session_expiration_update_cb) 833 const SessionExpirationUpdateCB& session_expiration_update_cb)
812 : scheme_uuid_(scheme_uuid), 834 : scheme_uuid_(scheme_uuid),
813 storage_(url::Origin(security_origin), create_storage_cb), 835 storage_(std::move(storage)),
814 create_fetcher_cb_(create_fetcher_cb), 836 create_fetcher_cb_(create_fetcher_cb),
815 session_message_cb_(session_message_cb), 837 session_message_cb_(session_message_cb),
816 session_closed_cb_(session_closed_cb), 838 session_closed_cb_(session_closed_cb),
817 session_keys_change_cb_(session_keys_change_cb), 839 session_keys_change_cb_(session_keys_change_cb),
818 session_expiration_update_cb_(session_expiration_update_cb), 840 session_expiration_update_cb_(session_expiration_update_cb),
819 task_runner_(base::ThreadTaskRunnerHandle::Get()), 841 task_runner_(base::ThreadTaskRunnerHandle::Get()),
820 media_drm_bridge_cdm_context_(this), 842 media_drm_bridge_cdm_context_(this),
821 weak_factory_(this) { 843 weak_factory_(this) {
822 DVLOG(1) << __func__; 844 DVLOG(1) << __func__;
823 845
824 DCHECK(!create_fetcher_cb_.is_null()); 846 DCHECK(storage_);
847 DCHECK(create_fetcher_cb_);
825 848
826 JNIEnv* env = AttachCurrentThread(); 849 JNIEnv* env = AttachCurrentThread();
827 CHECK(env); 850 CHECK(env);
828 851
829 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = 852 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid =
830 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); 853 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size());
831 854
832 std::string security_level_str = GetSecurityLevelString(security_level); 855 std::string security_level_str = GetSecurityLevelString(security_level);
833 ScopedJavaLocalRef<jstring> j_security_level = 856 ScopedJavaLocalRef<jstring> j_security_level =
834 ConvertUTF8ToJavaString(env, security_level_str); 857 ConvertUTF8ToJavaString(env, security_level_str);
835 858
836 bool use_origin_isolated_storage = 859 bool use_origin_isolated_storage =
837 // TODO(yucliu): Remove the check once persistent storage is fully 860 // TODO(yucliu): Remove the check once persistent storage is fully
838 // supported and check if origin is valid. 861 // supported and check if origin is valid.
839 base::FeatureList::IsEnabled(kMediaDrmPersistentLicense) && 862 base::FeatureList::IsEnabled(kMediaDrmPersistentLicense) &&
840 // MediaDrm implements origin isolated storage on M. 863 // MediaDrm implements origin isolated storage on M.
841 base::android::BuildInfo::GetInstance()->sdk_int() >= 23; 864 base::android::BuildInfo::GetInstance()->sdk_int() >= 23 &&
865 !storage_->origin_id().empty();
xhwang 2017/07/21 18:18:26 Add a comment about when the origin_id could be em
yucliu1 2017/07/21 20:24:09 Done.
842 866
843 // TODO(yucliu): Per EME spec on individualization, implementation should not 867 // TODO(yucliu): Per EME spec on individualization, implementation should not
844 // expose application-specific information. Considering encode origin before 868 // expose application-specific information. Considering encode origin before
845 // passing to MediaDrm. 869 // passing to MediaDrm.
846 ScopedJavaLocalRef<jstring> j_security_origin = ConvertUTF8ToJavaString( 870 ScopedJavaLocalRef<jstring> j_security_origin = ConvertUTF8ToJavaString(
847 env, use_origin_isolated_storage ? security_origin.spec() : ""); 871 env, use_origin_isolated_storage ? storage_->origin_id() : "");
848 872
849 // TODO(yucliu): Use |create_storage_cb_| to create MediaDrmStorage which can 873 // TODO(yucliu): Use |create_storage_cb_| to create MediaDrmStorage which can
850 // be used by Java side to store/retrieve persistent data. This should only 874 // be used by Java side to store/retrieve persistent data. This should only
851 // be used when |use_origin_isolated_storage| is true. 875 // be used when |use_origin_isolated_storage| is true.
852 876
853 // Note: OnMediaCryptoReady() could be called in this call. 877 // Note: OnMediaCryptoReady() could be called in this call.
854 j_media_drm_.Reset(Java_MediaDrmBridge_create( 878 j_media_drm_.Reset(Java_MediaDrmBridge_create(
855 env, j_scheme_uuid, j_security_origin, j_security_level, 879 env, j_scheme_uuid, j_security_origin, j_security_level,
856 reinterpret_cast<intptr_t>(this), reinterpret_cast<intptr_t>(&storage_))); 880 reinterpret_cast<intptr_t>(this),
881 reinterpret_cast<intptr_t>(storage_.get())));
857 } 882 }
858 883
859 MediaDrmBridge::~MediaDrmBridge() { 884 MediaDrmBridge::~MediaDrmBridge() {
860 DCHECK(task_runner_->BelongsToCurrentThread()); 885 DCHECK(task_runner_->BelongsToCurrentThread());
861 DVLOG(1) << __func__; 886 DVLOG(1) << __func__;
862 887
863 JNIEnv* env = AttachCurrentThread(); 888 JNIEnv* env = AttachCurrentThread();
864 889
865 // After the call to Java_MediaDrmBridge_destroy() Java won't call native 890 // After the call to Java_MediaDrmBridge_destroy() Java won't call native
866 // methods anymore, this is ensured by MediaDrmBridge.java. 891 // methods anymore, this is ensured by MediaDrmBridge.java.
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 } 964 }
940 965
941 void MediaDrmBridge::OnHasAdditionalUsableKey() { 966 void MediaDrmBridge::OnHasAdditionalUsableKey() {
942 DCHECK(task_runner_->BelongsToCurrentThread()); 967 DCHECK(task_runner_->BelongsToCurrentThread());
943 DVLOG(1) << __func__; 968 DVLOG(1) << __func__;
944 969
945 player_tracker_.NotifyNewKey(); 970 player_tracker_.NotifyNewKey();
946 } 971 }
947 972
948 } // namespace media 973 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698