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/callback_helpers.h" | 13 #include "base/callback_helpers.h" |
13 #include "base/containers/hash_tables.h" | 14 #include "base/containers/hash_tables.h" |
14 #include "base/lazy_instance.h" | 15 #include "base/lazy_instance.h" |
15 #include "base/location.h" | 16 #include "base/location.h" |
16 #include "base/logging.h" | 17 #include "base/logging.h" |
17 #include "base/single_thread_task_runner.h" | 18 #include "base/single_thread_task_runner.h" |
18 #include "base/stl_util.h" | 19 #include "base/stl_util.h" |
19 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
20 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
21 #include "base/sys_byteorder.h" | 22 #include "base/sys_byteorder.h" |
22 #include "base/sys_info.h" | 23 #include "base/sys_info.h" |
23 #include "base/thread_task_runner_handle.h" | 24 #include "base/thread_task_runner_handle.h" |
24 #include "jni/MediaDrmBridge_jni.h" | 25 #include "jni/MediaDrmBridge_jni.h" |
25 #include "media/base/android/media_client_android.h" | 26 #include "media/base/android/media_client_android.h" |
26 #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" | |
27 #include "media/base/cdm_key_information.h" | 29 #include "media/base/cdm_key_information.h" |
28 | 30 |
29 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. | 31 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
30 | 32 |
31 using base::android::AttachCurrentThread; | 33 using base::android::AttachCurrentThread; |
32 using base::android::ConvertUTF8ToJavaString; | 34 using base::android::ConvertUTF8ToJavaString; |
33 using base::android::ConvertJavaStringToUTF8; | 35 using base::android::ConvertJavaStringToUTF8; |
34 using base::android::JavaByteArrayToByteVector; | 36 using base::android::JavaByteArrayToByteVector; |
35 using base::android::ScopedJavaLocalRef; | 37 using base::android::ScopedJavaLocalRef; |
38 using base::android::ScopedJavaGlobalRef; | |
xhwang
2015/09/29 17:28:23
nit: order
Tima Vaisburd
2015/09/29 19:55:44
Done.
| |
36 | 39 |
37 namespace media { | 40 namespace media { |
38 | 41 |
39 namespace { | 42 namespace { |
40 | 43 |
41 // These must be in sync with Android MediaDrm REQUEST_TYPE_XXX constants! | 44 // These must be in sync with Android MediaDrm REQUEST_TYPE_XXX constants! |
42 // https://developer.android.com/reference/android/media/MediaDrm.KeyRequest.htm l | 45 // https://developer.android.com/reference/android/media/MediaDrm.KeyRequest.htm l |
43 enum class RequestType { | 46 enum class RequestType { |
44 REQUEST_TYPE_INITIAL = 0, | 47 REQUEST_TYPE_INITIAL = 0, |
45 REQUEST_TYPE_RENEWAL = 1, | 48 REQUEST_TYPE_RENEWAL = 1, |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
247 } | 250 } |
248 | 251 |
249 // static | 252 // static |
250 bool MediaDrmBridge::IsKeySystemSupportedWithType( | 253 bool MediaDrmBridge::IsKeySystemSupportedWithType( |
251 const std::string& key_system, | 254 const std::string& key_system, |
252 const std::string& container_mime_type) { | 255 const std::string& container_mime_type) { |
253 DCHECK(!key_system.empty() && !container_mime_type.empty()); | 256 DCHECK(!key_system.empty() && !container_mime_type.empty()); |
254 return IsKeySystemSupportedWithTypeImpl(key_system, container_mime_type); | 257 return IsKeySystemSupportedWithTypeImpl(key_system, container_mime_type); |
255 } | 258 } |
256 | 259 |
260 // static | |
257 bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { | 261 bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { |
258 return RegisterNativesImpl(env); | 262 return RegisterNativesImpl(env); |
259 } | 263 } |
260 | 264 |
261 MediaDrmBridge::MediaDrmBridge( | 265 MediaDrmBridge::MediaDrmBridge( |
262 const std::vector<uint8>& scheme_uuid, | 266 const std::vector<uint8>& scheme_uuid, |
263 const SessionMessageCB& session_message_cb, | 267 const SessionMessageCB& session_message_cb, |
264 const SessionClosedCB& session_closed_cb, | 268 const SessionClosedCB& session_closed_cb, |
265 const LegacySessionErrorCB& legacy_session_error_cb, | 269 const LegacySessionErrorCB& legacy_session_error_cb, |
266 const SessionKeysChangeCB& session_keys_change_cb, | 270 const SessionKeysChangeCB& session_keys_change_cb, |
267 const SessionExpirationUpdateCB& session_expiration_update_cb) | 271 const SessionExpirationUpdateCB& session_expiration_update_cb) |
268 : scheme_uuid_(scheme_uuid), | 272 : scheme_uuid_(scheme_uuid), |
269 session_message_cb_(session_message_cb), | 273 session_message_cb_(session_message_cb), |
270 session_closed_cb_(session_closed_cb), | 274 session_closed_cb_(session_closed_cb), |
271 legacy_session_error_cb_(legacy_session_error_cb), | 275 legacy_session_error_cb_(legacy_session_error_cb), |
272 session_keys_change_cb_(session_keys_change_cb), | 276 session_keys_change_cb_(session_keys_change_cb), |
273 session_expiration_update_cb_(session_expiration_update_cb) { | 277 session_expiration_update_cb_(session_expiration_update_cb), |
278 ui_task_runner_(base::ThreadTaskRunnerHandle::Get()), | |
279 use_media_thread_(UseMediaThreadForMediaPlayback()), | |
280 media_weak_factory_(this), | |
281 ui_weak_factory_(this) { | |
282 DVLOG(1) << "MediaDrmBridge::MediaDrmBridge"; | |
283 | |
274 JNIEnv* env = AttachCurrentThread(); | 284 JNIEnv* env = AttachCurrentThread(); |
275 CHECK(env); | 285 CHECK(env); |
276 | 286 |
277 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = | 287 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = |
278 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); | 288 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); |
279 j_media_drm_.Reset(Java_MediaDrmBridge_create( | 289 j_media_drm_.Reset(Java_MediaDrmBridge_create( |
280 env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this))); | 290 env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this))); |
281 } | 291 } |
282 | 292 |
283 MediaDrmBridge::~MediaDrmBridge() { | 293 void MediaDrmBridge::DeleteOnCorrectThread() { |
294 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | |
295 DVLOG(1) << "MediaDrmBridge::" << __FUNCTION__; | |
296 | |
284 JNIEnv* env = AttachCurrentThread(); | 297 JNIEnv* env = AttachCurrentThread(); |
285 player_tracker_.NotifyCdmUnset(); | |
286 if (!j_media_drm_.is_null()) | 298 if (!j_media_drm_.is_null()) |
287 Java_MediaDrmBridge_destroy(env, j_media_drm_.obj()); | 299 Java_MediaDrmBridge_destroy(env, j_media_drm_.obj()); |
xhwang
2015/09/29 17:28:23
nit: Could you please add a comment here that afte
Tima Vaisburd
2015/09/29 19:55:44
Done.
| |
300 | |
301 // Post deletion onto Media thread if we use it. | |
302 if (use_media_thread_) { | |
303 ui_weak_factory_.InvalidateWeakPtrs(); | |
304 GetMediaTaskRunner()->DeleteSoon(FROM_HERE, this); | |
305 } else { | |
306 delete this; | |
307 } | |
308 } | |
309 | |
310 MediaDrmBridge::~MediaDrmBridge() { | |
311 DVLOG(1) << "MediaDrmBridge::" << __FUNCTION__; | |
312 | |
313 DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); | |
314 | |
315 player_tracker_.NotifyCdmUnset(); | |
288 } | 316 } |
289 | 317 |
290 // static | 318 // static |
291 scoped_ptr<MediaDrmBridge> MediaDrmBridge::Create( | 319 scoped_ptr<MediaDrmBridge, BrowserCdmDeleter> MediaDrmBridge::Create( |
292 const std::string& key_system, | 320 const std::string& key_system, |
293 const SessionMessageCB& session_message_cb, | 321 const SessionMessageCB& session_message_cb, |
294 const SessionClosedCB& session_closed_cb, | 322 const SessionClosedCB& session_closed_cb, |
295 const LegacySessionErrorCB& legacy_session_error_cb, | 323 const LegacySessionErrorCB& legacy_session_error_cb, |
296 const SessionKeysChangeCB& session_keys_change_cb, | 324 const SessionKeysChangeCB& session_keys_change_cb, |
297 const SessionExpirationUpdateCB& session_expiration_update_cb) { | 325 const SessionExpirationUpdateCB& session_expiration_update_cb) { |
298 scoped_ptr<MediaDrmBridge> media_drm_bridge; | 326 scoped_ptr<MediaDrmBridge, BrowserCdmDeleter> media_drm_bridge; |
299 if (!IsAvailable()) | 327 if (!IsAvailable()) |
300 return media_drm_bridge.Pass(); | 328 return media_drm_bridge.Pass(); |
301 | 329 |
302 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); | 330 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); |
303 if (scheme_uuid.empty()) | 331 if (scheme_uuid.empty()) |
304 return media_drm_bridge.Pass(); | 332 return media_drm_bridge.Pass(); |
305 | 333 |
306 media_drm_bridge.reset( | 334 media_drm_bridge.reset( |
307 new MediaDrmBridge(scheme_uuid, session_message_cb, session_closed_cb, | 335 new MediaDrmBridge(scheme_uuid, session_message_cb, session_closed_cb, |
308 legacy_session_error_cb, session_keys_change_cb, | 336 legacy_session_error_cb, session_keys_change_cb, |
309 session_expiration_update_cb)); | 337 session_expiration_update_cb)); |
310 | 338 |
311 if (media_drm_bridge->j_media_drm_.is_null()) | 339 if (media_drm_bridge->j_media_drm_.is_null()) |
312 media_drm_bridge.reset(); | 340 media_drm_bridge.reset(); |
313 | 341 |
314 return media_drm_bridge.Pass(); | 342 return media_drm_bridge.Pass(); |
315 } | 343 } |
316 | 344 |
317 // static | 345 // static |
318 scoped_ptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( | 346 scoped_ptr<MediaDrmBridge, BrowserCdmDeleter> |
319 const std::string& key_system) { | 347 MediaDrmBridge::CreateWithoutSessionSupport(const std::string& key_system) { |
320 return MediaDrmBridge::Create( | 348 return MediaDrmBridge::Create( |
321 key_system, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(), | 349 key_system, SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(), |
322 SessionKeysChangeCB(), SessionExpirationUpdateCB()); | 350 SessionKeysChangeCB(), SessionExpirationUpdateCB()); |
323 } | 351 } |
324 | 352 |
325 bool MediaDrmBridge::SetSecurityLevel(SecurityLevel security_level) { | 353 bool MediaDrmBridge::SetSecurityLevel(SecurityLevel security_level) { |
326 if (security_level != SECURITY_LEVEL_NONE && | 354 if (security_level != SECURITY_LEVEL_NONE && |
327 !std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) { | 355 !std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) { |
328 NOTREACHED() << "Widevine security level " << security_level | 356 NOTREACHED() << "Widevine security level " << security_level |
329 << "used with another key system"; | 357 << "used with another key system"; |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
457 promise->reject(NOT_SUPPORTED_ERROR, 0, "RemoveSession() is not supported."); | 485 promise->reject(NOT_SUPPORTED_ERROR, 0, "RemoveSession() is not supported."); |
458 } | 486 } |
459 | 487 |
460 CdmContext* MediaDrmBridge::GetCdmContext() { | 488 CdmContext* MediaDrmBridge::GetCdmContext() { |
461 NOTREACHED(); | 489 NOTREACHED(); |
462 return nullptr; | 490 return nullptr; |
463 } | 491 } |
464 | 492 |
465 int MediaDrmBridge::RegisterPlayer(const base::Closure& new_key_cb, | 493 int MediaDrmBridge::RegisterPlayer(const base::Closure& new_key_cb, |
466 const base::Closure& cdm_unset_cb) { | 494 const base::Closure& cdm_unset_cb) { |
495 DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); | |
467 return player_tracker_.RegisterPlayer(new_key_cb, cdm_unset_cb); | 496 return player_tracker_.RegisterPlayer(new_key_cb, cdm_unset_cb); |
468 } | 497 } |
469 | 498 |
470 void MediaDrmBridge::UnregisterPlayer(int registration_id) { | 499 void MediaDrmBridge::UnregisterPlayer(int registration_id) { |
500 DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); | |
471 player_tracker_.UnregisterPlayer(registration_id); | 501 player_tracker_.UnregisterPlayer(registration_id); |
472 } | 502 } |
473 | 503 |
474 void MediaDrmBridge::SetMediaCryptoReadyCB(const base::Closure& closure) { | 504 void MediaDrmBridge::SetMediaCryptoReadyCB(const MediaCryptoReadyCB& closure) { |
xhwang
2015/09/29 17:28:23
Can you let the caller (e.g. MediaSourcePlayer) de
Tima Vaisburd
2015/09/29 21:51:40
Done.
| |
505 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | |
506 DVLOG(1) << "MediaDrmBridge::" << __FUNCTION__; | |
507 | |
475 if (closure.is_null()) { | 508 if (closure.is_null()) { |
476 media_crypto_ready_cb_.Reset(); | 509 media_crypto_ready_cb_.Reset(); |
477 return; | 510 return; |
478 } | 511 } |
479 | 512 |
480 DCHECK(media_crypto_ready_cb_.is_null()); | 513 DCHECK(media_crypto_ready_cb_.is_null()); |
481 | 514 |
482 if (!GetMediaCrypto().is_null()) { | 515 if (!GetMediaCrypto().is_null()) { |
483 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, closure); | 516 PostMediaCryptoReadyOnCorrectThread(closure, true); |
484 return; | 517 return; |
485 } | 518 } |
486 | 519 |
487 media_crypto_ready_cb_ = closure; | 520 media_crypto_ready_cb_ = closure; |
488 } | 521 } |
489 | 522 |
490 void MediaDrmBridge::OnMediaCryptoReady(JNIEnv* env, jobject) { | 523 void MediaDrmBridge::OnMediaCryptoReady(JNIEnv* env, jobject j_media_drm) { |
524 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | |
525 DVLOG(1) << "MediaDrmBridge::" << __FUNCTION__; | |
526 | |
491 DCHECK(!GetMediaCrypto().is_null()); | 527 DCHECK(!GetMediaCrypto().is_null()); |
492 if (!media_crypto_ready_cb_.is_null()) | 528 |
493 base::ResetAndReturn(&media_crypto_ready_cb_).Run(); | 529 if (media_crypto_ready_cb_.is_null()) |
530 return; | |
531 | |
532 PostMediaCryptoReadyOnCorrectThread( | |
533 base::ResetAndReturn(&media_crypto_ready_cb_), false); | |
534 } | |
535 | |
536 void MediaDrmBridge::PostMediaCryptoReadyOnCorrectThread( | |
537 const MediaCryptoReadyCB& cb, | |
538 bool always_post_on_ui_thread) { | |
539 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | |
540 | |
541 DCHECK(!cb.is_null()); | |
542 DCHECK(!GetMediaCrypto().is_null()); | |
543 | |
544 // We can use scoped_ptr to pass ScopedJavaGlobalRef with a callback. | |
545 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr( | |
546 new ScopedJavaGlobalRef<jobject>()); | |
547 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj()); | |
548 | |
549 bool needs_protected_surface = IsProtectedSurfaceRequired(); | |
550 | |
551 if (use_media_thread_) { | |
552 GetMediaTaskRunner()->PostTask( | |
553 FROM_HERE, | |
554 base::Bind(cb, base::Passed(&j_object_ptr), needs_protected_surface)); | |
555 } else if (always_post_on_ui_thread) { | |
556 ui_task_runner_->PostTask( | |
557 FROM_HERE, | |
558 base::Bind(cb, base::Passed(&j_object_ptr), needs_protected_surface)); | |
559 } else { | |
560 cb.Run(j_object_ptr.Pass(), needs_protected_surface); | |
561 } | |
494 } | 562 } |
495 | 563 |
496 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env, | 564 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env, |
497 jobject j_media_drm, | 565 jobject j_media_drm, |
498 jint j_promise_id) { | 566 jint j_promise_id) { |
499 cdm_promise_adapter_.ResolvePromise(j_promise_id); | 567 cdm_promise_adapter_.ResolvePromise(j_promise_id); |
500 } | 568 } |
501 | 569 |
502 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env, | 570 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env, |
503 jobject j_media_drm, | 571 jobject j_media_drm, |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
538 jbyteArray j_session_id) { | 606 jbyteArray j_session_id) { |
539 session_closed_cb_.Run(GetSessionId(env, j_session_id)); | 607 session_closed_cb_.Run(GetSessionId(env, j_session_id)); |
540 } | 608 } |
541 | 609 |
542 void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env, | 610 void MediaDrmBridge::OnSessionKeysChange(JNIEnv* env, |
543 jobject j_media_drm, | 611 jobject j_media_drm, |
544 jbyteArray j_session_id, | 612 jbyteArray j_session_id, |
545 jobjectArray j_keys_info, | 613 jobjectArray j_keys_info, |
546 bool has_additional_usable_key) { | 614 bool has_additional_usable_key) { |
547 if (has_additional_usable_key) | 615 if (has_additional_usable_key) |
548 player_tracker_.NotifyNewKey(); | 616 NotifyNewKeyOnCorrectThread(); |
549 | 617 |
550 CdmKeysInfo cdm_keys_info; | 618 CdmKeysInfo cdm_keys_info; |
551 | 619 |
552 size_t size = env->GetArrayLength(j_keys_info); | 620 size_t size = env->GetArrayLength(j_keys_info); |
553 DCHECK_GT(size, 0u); | 621 DCHECK_GT(size, 0u); |
554 | 622 |
555 for (size_t i = 0; i < size; ++i) { | 623 for (size_t i = 0; i < size; ++i) { |
556 ScopedJavaLocalRef<jobject> j_key_status( | 624 ScopedJavaLocalRef<jobject> j_key_status( |
557 env, env->GetObjectArrayElement(j_keys_info, i)); | 625 env, env->GetObjectArrayElement(j_keys_info, i)); |
558 | 626 |
(...skipping 17 matching lines...) Expand all Loading... | |
576 scoped_ptr<CdmKeyInformation> cdm_key_information(new CdmKeyInformation()); | 644 scoped_ptr<CdmKeyInformation> cdm_key_information(new CdmKeyInformation()); |
577 cdm_key_information->key_id = key_id; | 645 cdm_key_information->key_id = key_id; |
578 cdm_key_information->status = key_status; | 646 cdm_key_information->status = key_status; |
579 cdm_keys_info.push_back(cdm_key_information.release()); | 647 cdm_keys_info.push_back(cdm_key_information.release()); |
580 } | 648 } |
581 | 649 |
582 session_keys_change_cb_.Run(GetSessionId(env, j_session_id), | 650 session_keys_change_cb_.Run(GetSessionId(env, j_session_id), |
583 has_additional_usable_key, cdm_keys_info.Pass()); | 651 has_additional_usable_key, cdm_keys_info.Pass()); |
584 } | 652 } |
585 | 653 |
654 void MediaDrmBridge::NotifyNewKeyOnCorrectThread() { | |
655 // Repost this method onto the Media thread if |use_media_thread_| is true. | |
656 if (use_media_thread_ && !GetMediaTaskRunner()->BelongsToCurrentThread()) { | |
657 GetMediaTaskRunner()->PostTask( | |
658 FROM_HERE, base::Bind(&MediaDrmBridge::NotifyNewKeyOnCorrectThread, | |
659 media_weak_factory_.GetWeakPtr())); | |
660 return; | |
661 } | |
662 | |
663 DCHECK(!use_media_thread_ || GetMediaTaskRunner()->BelongsToCurrentThread()); | |
664 DVLOG(1) << "MediaDrmBridge::" << __FUNCTION__; | |
665 | |
666 player_tracker_.NotifyNewKey(); | |
667 } | |
668 | |
586 // According to MeidaDrm documentation [1], zero |expiry_time_ms| means the keys | 669 // According to MeidaDrm documentation [1], zero |expiry_time_ms| means the keys |
587 // will never expire. This will be translated into a NULL base::Time() [2], | 670 // will never expire. This will be translated into a NULL base::Time() [2], |
588 // which will then be mapped to a zero Java time [3]. The zero Java time is | 671 // which will then be mapped to a zero Java time [3]. The zero Java time is |
589 // passed to Blink which will then be translated to NaN [4], which is what the | 672 // passed to Blink which will then be translated to NaN [4], which is what the |
590 // spec uses to indicate that the license will never expire [5]. | 673 // spec uses to indicate that the license will never expire [5]. |
591 // [1] http://developer.android.com/reference/android/media/MediaDrm.OnExpiratio nUpdateListener.html | 674 // [1] http://developer.android.com/reference/android/media/MediaDrm.OnExpiratio nUpdateListener.html |
592 // [2] See base::Time::FromDoubleT() | 675 // [2] See base::Time::FromDoubleT() |
593 // [3] See base::Time::ToJavaTime() | 676 // [3] See base::Time::ToJavaTime() |
594 // [4] See MediaKeySession::expirationChanged() | 677 // [4] See MediaKeySession::expirationChanged() |
595 // [5] https://github.com/w3c/encrypted-media/issues/58 | 678 // [5] https://github.com/w3c/encrypted-media/issues/58 |
(...skipping 10 matching lines...) Expand all Loading... | |
606 void MediaDrmBridge::OnLegacySessionError(JNIEnv* env, | 689 void MediaDrmBridge::OnLegacySessionError(JNIEnv* env, |
607 jobject j_media_drm, | 690 jobject j_media_drm, |
608 jbyteArray j_session_id, | 691 jbyteArray j_session_id, |
609 jstring j_error_message) { | 692 jstring j_error_message) { |
610 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message); | 693 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message); |
611 legacy_session_error_cb_.Run(GetSessionId(env, j_session_id), | 694 legacy_session_error_cb_.Run(GetSessionId(env, j_session_id), |
612 MediaKeys::UNKNOWN_ERROR, 0, error_message); | 695 MediaKeys::UNKNOWN_ERROR, 0, error_message); |
613 } | 696 } |
614 | 697 |
615 ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() { | 698 ScopedJavaLocalRef<jobject> MediaDrmBridge::GetMediaCrypto() { |
699 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | |
700 | |
616 JNIEnv* env = AttachCurrentThread(); | 701 JNIEnv* env = AttachCurrentThread(); |
617 return Java_MediaDrmBridge_getMediaCrypto(env, j_media_drm_.obj()); | 702 return Java_MediaDrmBridge_getMediaCrypto(env, j_media_drm_.obj()); |
618 } | 703 } |
619 | 704 |
620 MediaDrmBridge::SecurityLevel MediaDrmBridge::GetSecurityLevel() { | 705 MediaDrmBridge::SecurityLevel MediaDrmBridge::GetSecurityLevel() { |
621 JNIEnv* env = AttachCurrentThread(); | 706 JNIEnv* env = AttachCurrentThread(); |
622 ScopedJavaLocalRef<jstring> j_security_level = | 707 ScopedJavaLocalRef<jstring> j_security_level = |
623 Java_MediaDrmBridge_getSecurityLevel(env, j_media_drm_.obj()); | 708 Java_MediaDrmBridge_getSecurityLevel(env, j_media_drm_.obj()); |
624 std::string security_level_str = | 709 std::string security_level_str = |
625 ConvertJavaStringToUTF8(env, j_security_level.obj()); | 710 ConvertJavaStringToUTF8(env, j_security_level.obj()); |
626 return GetSecurityLevelFromString(security_level_str); | 711 return GetSecurityLevelFromString(security_level_str); |
627 } | 712 } |
628 | 713 |
629 bool MediaDrmBridge::IsProtectedSurfaceRequired() { | 714 bool MediaDrmBridge::IsProtectedSurfaceRequired() { |
630 // For Widevine, this depends on the security level. | 715 // For Widevine, this depends on the security level. |
631 if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) | 716 if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid)) |
632 return IsSecureDecoderRequired(GetSecurityLevel()); | 717 return IsSecureDecoderRequired(GetSecurityLevel()); |
633 | 718 |
634 // For other key systems, assume true. | 719 // For other key systems, assume true. |
635 return true; | 720 return true; |
636 } | 721 } |
637 | 722 |
723 base::WeakPtr<MediaDrmBridge> MediaDrmBridge::WeakPtrForUIThread() { | |
724 return ui_weak_factory_.GetWeakPtr(); | |
725 } | |
726 | |
638 void MediaDrmBridge::ResetDeviceCredentials( | 727 void MediaDrmBridge::ResetDeviceCredentials( |
639 const ResetCredentialsCB& callback) { | 728 const ResetCredentialsCB& callback) { |
640 DCHECK(reset_credentials_cb_.is_null()); | 729 DCHECK(reset_credentials_cb_.is_null()); |
641 reset_credentials_cb_ = callback; | 730 reset_credentials_cb_ = callback; |
642 JNIEnv* env = AttachCurrentThread(); | 731 JNIEnv* env = AttachCurrentThread(); |
643 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj()); | 732 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj()); |
644 } | 733 } |
645 | 734 |
646 void MediaDrmBridge::OnResetDeviceCredentialsCompleted( | 735 void MediaDrmBridge::OnResetDeviceCredentialsCompleted( |
647 JNIEnv* env, jobject, bool success) { | 736 JNIEnv* env, jobject, bool success) { |
648 base::ResetAndReturn(&reset_credentials_cb_).Run(success); | 737 base::ResetAndReturn(&reset_credentials_cb_).Run(success); |
649 } | 738 } |
650 | 739 |
651 } // namespace media | 740 } // namespace media |
OLD | NEW |