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

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

Issue 1344133002: MediaCodecPlayer implementation - stage 7 (DRM) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mtplayer-drm-prepare
Patch Set: Fixed CDMPromiseAdapter destruction in MediaDrmBridge, fixed the use of IsContentEncrypted() in theā€¦ Created 5 years, 2 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
« no previous file with comments | « media/base/android/media_drm_bridge.h ('k') | media/base/android/media_source_player.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <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
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()),
Tima Vaisburd 2015/10/01 00:36:07 The CL https://codereview.chromium.org/1375663003
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
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
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
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
OLDNEW
« no previous file with comments | « media/base/android/media_drm_bridge.h ('k') | media/base/android/media_source_player.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698