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" |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 const SessionClosedCB& session_closed_cb, | 268 const SessionClosedCB& session_closed_cb, |
269 const LegacySessionErrorCB& legacy_session_error_cb, | 269 const LegacySessionErrorCB& legacy_session_error_cb, |
270 const SessionKeysChangeCB& session_keys_change_cb, | 270 const SessionKeysChangeCB& session_keys_change_cb, |
271 const SessionExpirationUpdateCB& session_expiration_update_cb) | 271 const SessionExpirationUpdateCB& session_expiration_update_cb) |
272 : scheme_uuid_(scheme_uuid), | 272 : scheme_uuid_(scheme_uuid), |
273 session_message_cb_(session_message_cb), | 273 session_message_cb_(session_message_cb), |
274 session_closed_cb_(session_closed_cb), | 274 session_closed_cb_(session_closed_cb), |
275 legacy_session_error_cb_(legacy_session_error_cb), | 275 legacy_session_error_cb_(legacy_session_error_cb), |
276 session_keys_change_cb_(session_keys_change_cb), | 276 session_keys_change_cb_(session_keys_change_cb), |
277 session_expiration_update_cb_(session_expiration_update_cb), | 277 session_expiration_update_cb_(session_expiration_update_cb), |
| 278 cdm_promise_adapter_(new CdmPromiseAdapter()), |
278 ui_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 279 ui_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
279 use_media_thread_(UseMediaThreadForMediaPlayback()), | 280 use_media_thread_(UseMediaThreadForMediaPlayback()), |
280 media_weak_factory_(this), | 281 media_weak_factory_(this), |
281 ui_weak_factory_(this) { | 282 ui_weak_factory_(this) { |
282 DVLOG(1) << __FUNCTION__; | 283 DVLOG(1) << __FUNCTION__; |
283 | 284 |
284 JNIEnv* env = AttachCurrentThread(); | 285 JNIEnv* env = AttachCurrentThread(); |
285 CHECK(env); | 286 CHECK(env); |
286 | 287 |
287 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = | 288 ScopedJavaLocalRef<jbyteArray> j_scheme_uuid = |
288 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); | 289 base::android::ToJavaByteArray(env, &scheme_uuid[0], scheme_uuid.size()); |
289 j_media_drm_.Reset(Java_MediaDrmBridge_create( | 290 j_media_drm_.Reset(Java_MediaDrmBridge_create( |
290 env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this))); | 291 env, j_scheme_uuid.obj(), reinterpret_cast<intptr_t>(this))); |
291 } | 292 } |
292 | 293 |
293 void MediaDrmBridge::DeleteOnCorrectThread() { | 294 void MediaDrmBridge::DeleteOnCorrectThread() { |
294 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 295 DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
295 DVLOG(1) << __FUNCTION__; | 296 DVLOG(1) << __FUNCTION__; |
296 | 297 |
297 JNIEnv* env = AttachCurrentThread(); | 298 JNIEnv* env = AttachCurrentThread(); |
298 if (!j_media_drm_.is_null()) | 299 if (!j_media_drm_.is_null()) |
299 Java_MediaDrmBridge_destroy(env, j_media_drm_.obj()); | 300 Java_MediaDrmBridge_destroy(env, j_media_drm_.obj()); |
300 | 301 |
301 // After the call to Java_MediaDrmBridge_destroy() Java won't call native | 302 // After the call to Java_MediaDrmBridge_destroy() Java won't call native |
302 // methods anymore, this is ensured by MediaDrmBridge.java. | 303 // methods anymore, this is ensured by MediaDrmBridge.java. |
303 | 304 |
| 305 // CdmPromiseAdapter must be destroyed on the UI thread. |
| 306 cdm_promise_adapter_.reset(); |
| 307 |
304 // Post deletion onto Media thread if we use it. | 308 // Post deletion onto Media thread if we use it. |
305 if (use_media_thread_) { | 309 if (use_media_thread_) { |
306 ui_weak_factory_.InvalidateWeakPtrs(); | 310 ui_weak_factory_.InvalidateWeakPtrs(); |
307 GetMediaTaskRunner()->DeleteSoon(FROM_HERE, this); | 311 GetMediaTaskRunner()->DeleteSoon(FROM_HERE, this); |
308 } else { | 312 } else { |
309 delete this; | 313 delete this; |
310 } | 314 } |
311 } | 315 } |
312 | 316 |
313 MediaDrmBridge::~MediaDrmBridge() { | 317 MediaDrmBridge::~MediaDrmBridge() { |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 } | 434 } |
431 } | 435 } |
432 | 436 |
433 if (j_init_data.is_null()) { | 437 if (j_init_data.is_null()) { |
434 j_init_data = base::android::ToJavaByteArray( | 438 j_init_data = base::android::ToJavaByteArray( |
435 env, vector_as_array(&init_data), init_data.size()); | 439 env, vector_as_array(&init_data), init_data.size()); |
436 } | 440 } |
437 | 441 |
438 ScopedJavaLocalRef<jstring> j_mime = | 442 ScopedJavaLocalRef<jstring> j_mime = |
439 ConvertUTF8ToJavaString(env, ConvertInitDataType(init_data_type)); | 443 ConvertUTF8ToJavaString(env, ConvertInitDataType(init_data_type)); |
440 uint32_t promise_id = cdm_promise_adapter_.SavePromise(promise.Pass()); | 444 uint32_t promise_id = cdm_promise_adapter_->SavePromise(promise.Pass()); |
441 Java_MediaDrmBridge_createSessionFromNative(env, j_media_drm_.obj(), | 445 Java_MediaDrmBridge_createSessionFromNative(env, j_media_drm_.obj(), |
442 j_init_data.obj(), j_mime.obj(), | 446 j_init_data.obj(), j_mime.obj(), |
443 j_optional_parameters.obj(), | 447 j_optional_parameters.obj(), |
444 promise_id); | 448 promise_id); |
445 } | 449 } |
446 | 450 |
447 void MediaDrmBridge::LoadSession( | 451 void MediaDrmBridge::LoadSession( |
448 SessionType session_type, | 452 SessionType session_type, |
449 const std::string& session_id, | 453 const std::string& session_id, |
450 scoped_ptr<media::NewSessionCdmPromise> promise) { | 454 scoped_ptr<media::NewSessionCdmPromise> promise) { |
451 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; | 455 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; |
452 promise->reject(NOT_SUPPORTED_ERROR, 0, "LoadSession() is not supported."); | 456 promise->reject(NOT_SUPPORTED_ERROR, 0, "LoadSession() is not supported."); |
453 } | 457 } |
454 | 458 |
455 void MediaDrmBridge::UpdateSession( | 459 void MediaDrmBridge::UpdateSession( |
456 const std::string& session_id, | 460 const std::string& session_id, |
457 const std::vector<uint8_t>& response, | 461 const std::vector<uint8_t>& response, |
458 scoped_ptr<media::SimpleCdmPromise> promise) { | 462 scoped_ptr<media::SimpleCdmPromise> promise) { |
459 DVLOG(1) << __FUNCTION__; | 463 DVLOG(1) << __FUNCTION__; |
460 | 464 |
461 JNIEnv* env = AttachCurrentThread(); | 465 JNIEnv* env = AttachCurrentThread(); |
462 ScopedJavaLocalRef<jbyteArray> j_response = base::android::ToJavaByteArray( | 466 ScopedJavaLocalRef<jbyteArray> j_response = base::android::ToJavaByteArray( |
463 env, vector_as_array(&response), response.size()); | 467 env, vector_as_array(&response), response.size()); |
464 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( | 468 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( |
465 env, reinterpret_cast<const uint8_t*>(session_id.data()), | 469 env, reinterpret_cast<const uint8_t*>(session_id.data()), |
466 session_id.size()); | 470 session_id.size()); |
467 uint32_t promise_id = cdm_promise_adapter_.SavePromise(promise.Pass()); | 471 uint32_t promise_id = cdm_promise_adapter_->SavePromise(promise.Pass()); |
468 Java_MediaDrmBridge_updateSession(env, j_media_drm_.obj(), j_session_id.obj(), | 472 Java_MediaDrmBridge_updateSession(env, j_media_drm_.obj(), j_session_id.obj(), |
469 j_response.obj(), promise_id); | 473 j_response.obj(), promise_id); |
470 } | 474 } |
471 | 475 |
472 void MediaDrmBridge::CloseSession(const std::string& session_id, | 476 void MediaDrmBridge::CloseSession(const std::string& session_id, |
473 scoped_ptr<media::SimpleCdmPromise> promise) { | 477 scoped_ptr<media::SimpleCdmPromise> promise) { |
474 DVLOG(1) << __FUNCTION__; | 478 DVLOG(1) << __FUNCTION__; |
475 JNIEnv* env = AttachCurrentThread(); | 479 JNIEnv* env = AttachCurrentThread(); |
476 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( | 480 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( |
477 env, reinterpret_cast<const uint8_t*>(session_id.data()), | 481 env, reinterpret_cast<const uint8_t*>(session_id.data()), |
478 session_id.size()); | 482 session_id.size()); |
479 uint32_t promise_id = cdm_promise_adapter_.SavePromise(promise.Pass()); | 483 uint32_t promise_id = cdm_promise_adapter_->SavePromise(promise.Pass()); |
480 Java_MediaDrmBridge_closeSession(env, j_media_drm_.obj(), j_session_id.obj(), | 484 Java_MediaDrmBridge_closeSession(env, j_media_drm_.obj(), j_session_id.obj(), |
481 promise_id); | 485 promise_id); |
482 } | 486 } |
483 | 487 |
484 void MediaDrmBridge::RemoveSession( | 488 void MediaDrmBridge::RemoveSession( |
485 const std::string& session_id, | 489 const std::string& session_id, |
486 scoped_ptr<media::SimpleCdmPromise> promise) { | 490 scoped_ptr<media::SimpleCdmPromise> promise) { |
487 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; | 491 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; |
488 promise->reject(NOT_SUPPORTED_ERROR, 0, "RemoveSession() is not supported."); | 492 promise->reject(NOT_SUPPORTED_ERROR, 0, "RemoveSession() is not supported."); |
489 } | 493 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr( | 552 scoped_ptr<ScopedJavaGlobalRef<jobject>> j_object_ptr( |
549 new ScopedJavaGlobalRef<jobject>()); | 553 new ScopedJavaGlobalRef<jobject>()); |
550 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj()); | 554 j_object_ptr->Reset(AttachCurrentThread(), GetMediaCrypto().obj()); |
551 | 555 |
552 cb.Run(j_object_ptr.Pass(), IsProtectedSurfaceRequired()); | 556 cb.Run(j_object_ptr.Pass(), IsProtectedSurfaceRequired()); |
553 } | 557 } |
554 | 558 |
555 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env, | 559 void MediaDrmBridge::OnPromiseResolved(JNIEnv* env, |
556 jobject j_media_drm, | 560 jobject j_media_drm, |
557 jint j_promise_id) { | 561 jint j_promise_id) { |
558 cdm_promise_adapter_.ResolvePromise(j_promise_id); | 562 cdm_promise_adapter_->ResolvePromise(j_promise_id); |
559 } | 563 } |
560 | 564 |
561 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env, | 565 void MediaDrmBridge::OnPromiseResolvedWithSession(JNIEnv* env, |
562 jobject j_media_drm, | 566 jobject j_media_drm, |
563 jint j_promise_id, | 567 jint j_promise_id, |
564 jbyteArray j_session_id) { | 568 jbyteArray j_session_id) { |
565 cdm_promise_adapter_.ResolvePromise(j_promise_id, | 569 cdm_promise_adapter_->ResolvePromise(j_promise_id, |
566 GetSessionId(env, j_session_id)); | 570 GetSessionId(env, j_session_id)); |
567 } | 571 } |
568 | 572 |
569 void MediaDrmBridge::OnPromiseRejected(JNIEnv* env, | 573 void MediaDrmBridge::OnPromiseRejected(JNIEnv* env, |
570 jobject j_media_drm, | 574 jobject j_media_drm, |
571 jint j_promise_id, | 575 jint j_promise_id, |
572 jstring j_error_message) { | 576 jstring j_error_message) { |
573 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message); | 577 std::string error_message = ConvertJavaStringToUTF8(env, j_error_message); |
574 cdm_promise_adapter_.RejectPromise(j_promise_id, MediaKeys::UNKNOWN_ERROR, 0, | 578 cdm_promise_adapter_->RejectPromise(j_promise_id, MediaKeys::UNKNOWN_ERROR, 0, |
575 error_message); | 579 error_message); |
576 } | 580 } |
577 | 581 |
578 void MediaDrmBridge::OnSessionMessage(JNIEnv* env, | 582 void MediaDrmBridge::OnSessionMessage(JNIEnv* env, |
579 jobject j_media_drm, | 583 jobject j_media_drm, |
580 jbyteArray j_session_id, | 584 jbyteArray j_session_id, |
581 jint j_message_type, | 585 jint j_message_type, |
582 jbyteArray j_message, | 586 jbyteArray j_message, |
583 jstring j_legacy_destination_url) { | 587 jstring j_legacy_destination_url) { |
584 std::vector<uint8> message; | 588 std::vector<uint8> message; |
585 JavaByteArrayToByteVector(env, j_message, &message); | 589 JavaByteArrayToByteVector(env, j_message, &message); |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 JNIEnv* env = AttachCurrentThread(); | 726 JNIEnv* env = AttachCurrentThread(); |
723 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj()); | 727 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj()); |
724 } | 728 } |
725 | 729 |
726 void MediaDrmBridge::OnResetDeviceCredentialsCompleted( | 730 void MediaDrmBridge::OnResetDeviceCredentialsCompleted( |
727 JNIEnv* env, jobject, bool success) { | 731 JNIEnv* env, jobject, bool success) { |
728 base::ResetAndReturn(&reset_credentials_cb_).Run(success); | 732 base::ResetAndReturn(&reset_credentials_cb_).Run(success); |
729 } | 733 } |
730 | 734 |
731 } // namespace media | 735 } // namespace media |
OLD | NEW |