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

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

Issue 1837143002: media: Pass MediaPermission to MediaDrmBridge Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More plumbing Created 4 years, 7 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/mojo/services/android_mojo_media_client.h » ('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 <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 11 matching lines...) Expand all
22 #include "base/strings/string_number_conversions.h" 22 #include "base/strings/string_number_conversions.h"
23 #include "base/strings/string_util.h" 23 #include "base/strings/string_util.h"
24 #include "base/sys_byteorder.h" 24 #include "base/sys_byteorder.h"
25 #include "base/sys_info.h" 25 #include "base/sys_info.h"
26 #include "base/thread_task_runner_handle.h" 26 #include "base/thread_task_runner_handle.h"
27 #include "jni/MediaDrmBridge_jni.h" 27 #include "jni/MediaDrmBridge_jni.h"
28 #include "media/base/android/media_client_android.h" 28 #include "media/base/android/media_client_android.h"
29 #include "media/base/android/media_codec_util.h" 29 #include "media/base/android/media_codec_util.h"
30 #include "media/base/android/media_drm_bridge_delegate.h" 30 #include "media/base/android/media_drm_bridge_delegate.h"
31 #include "media/base/android/provision_fetcher.h" 31 #include "media/base/android/provision_fetcher.h"
32 #include "media/base/media_permission.h"
32 #include "media/base/cdm_key_information.h" 33 #include "media/base/cdm_key_information.h"
33 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 34 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
34 35
35 using base::android::AttachCurrentThread; 36 using base::android::AttachCurrentThread;
36 using base::android::ConvertUTF8ToJavaString; 37 using base::android::ConvertUTF8ToJavaString;
37 using base::android::ConvertJavaStringToUTF8; 38 using base::android::ConvertJavaStringToUTF8;
38 using base::android::JavaByteArrayToByteVector; 39 using base::android::JavaByteArrayToByteVector;
39 using base::android::ScopedJavaGlobalRef; 40 using base::android::ScopedJavaGlobalRef;
40 using base::android::ScopedJavaLocalRef; 41 using base::android::ScopedJavaLocalRef;
41 42
(...skipping 25 matching lines...) Expand all
67 JavaByteArrayToByteVector(env, j_byte_array, &byte_vector); 68 JavaByteArrayToByteVector(env, j_byte_array, &byte_vector);
68 return std::string(byte_vector.begin(), byte_vector.end()); 69 return std::string(byte_vector.begin(), byte_vector.end());
69 } 70 }
70 71
71 const uint8_t kWidevineUuid[16] = { 72 const uint8_t kWidevineUuid[16] = {
72 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, // 73 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, //
73 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED}; 74 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED};
74 75
75 // Convert |init_data_type| to a string supported by MediaDRM. 76 // Convert |init_data_type| to a string supported by MediaDRM.
76 // "audio"/"video" does not matter, so use "video". 77 // "audio"/"video" does not matter, so use "video".
77 std::string ConvertInitDataType(media::EmeInitDataType init_data_type) { 78 std::string ConvertInitDataType(EmeInitDataType init_data_type) {
78 // TODO(jrummell/xhwang): EME init data types like "webm" and "cenc" are 79 // TODO(jrummell/xhwang): EME init data types like "webm" and "cenc" are
79 // supported in API level >=21 for Widevine key system. Switch to use those 80 // supported in API level >=21 for Widevine key system. Switch to use those
80 // strings when they are officially supported in Android for all key systems. 81 // strings when they are officially supported in Android for all key systems.
81 switch (init_data_type) { 82 switch (init_data_type) {
82 case media::EmeInitDataType::WEBM: 83 case EmeInitDataType::WEBM:
83 return "video/webm"; 84 return "video/webm";
84 case media::EmeInitDataType::CENC: 85 case EmeInitDataType::CENC:
85 return "video/mp4"; 86 return "video/mp4";
86 case media::EmeInitDataType::KEYIDS: 87 case EmeInitDataType::KEYIDS:
87 return "keyids"; 88 return "keyids";
88 default: 89 default:
89 NOTREACHED(); 90 NOTREACHED();
90 return "unknown"; 91 return "unknown";
91 } 92 }
92 } 93 }
93 94
94 MediaKeys::MessageType GetMessageType(RequestType request_type) { 95 MediaKeys::MessageType GetMessageType(RequestType request_type) {
95 switch (request_type) { 96 switch (request_type) {
96 case RequestType::REQUEST_TYPE_INITIAL: 97 case RequestType::REQUEST_TYPE_INITIAL:
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() { 274 std::vector<std::string> MediaDrmBridge::GetPlatformKeySystemNames() {
274 if (!MediaDrmBridge::IsAvailable()) 275 if (!MediaDrmBridge::IsAvailable())
275 return std::vector<std::string>(); 276 return std::vector<std::string>();
276 277
277 return g_key_system_manager.Get().GetPlatformKeySystemNames(); 278 return g_key_system_manager.Get().GetPlatformKeySystemNames();
278 } 279 }
279 280
280 // static 281 // static
281 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateInternal( 282 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateInternal(
282 const std::string& key_system, 283 const std::string& key_system,
284 const GURL& security_origin,
283 SecurityLevel security_level, 285 SecurityLevel security_level,
286 MediaPermission* media_permission,
284 const CreateFetcherCB& create_fetcher_cb, 287 const CreateFetcherCB& create_fetcher_cb,
285 const SessionMessageCB& session_message_cb, 288 const SessionMessageCB& session_message_cb,
286 const SessionClosedCB& session_closed_cb, 289 const SessionClosedCB& session_closed_cb,
287 const LegacySessionErrorCB& legacy_session_error_cb, 290 const LegacySessionErrorCB& legacy_session_error_cb,
288 const SessionKeysChangeCB& session_keys_change_cb, 291 const SessionKeysChangeCB& session_keys_change_cb,
289 const SessionExpirationUpdateCB& session_expiration_update_cb) { 292 const SessionExpirationUpdateCB& session_expiration_update_cb) {
290 // All paths requires the MediaDrmApis. 293 // All paths requires the MediaDrmApis.
291 DCHECK(AreMediaDrmApisAvailable()); 294 DCHECK(AreMediaDrmApisAvailable());
292 295
293 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system); 296 UUID scheme_uuid = g_key_system_manager.Get().GetUUID(key_system);
294 if (scheme_uuid.empty()) 297 if (scheme_uuid.empty())
295 return nullptr; 298 return nullptr;
296 299
297 scoped_refptr<MediaDrmBridge> media_drm_bridge(new MediaDrmBridge( 300 scoped_refptr<MediaDrmBridge> media_drm_bridge(new MediaDrmBridge(
298 scheme_uuid, security_level, create_fetcher_cb, session_message_cb, 301 scheme_uuid, security_origin, security_level, media_permission,
299 session_closed_cb, legacy_session_error_cb, session_keys_change_cb, 302 create_fetcher_cb, session_message_cb, session_closed_cb,
303 legacy_session_error_cb, session_keys_change_cb,
300 session_expiration_update_cb)); 304 session_expiration_update_cb));
301 305
302 if (media_drm_bridge->j_media_drm_.is_null()) 306 if (media_drm_bridge->j_media_drm_.is_null())
303 media_drm_bridge = nullptr; 307 media_drm_bridge = nullptr;
304 308
305 return media_drm_bridge; 309 return media_drm_bridge;
306 } 310 }
307 311
308 // static 312 // static
309 scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create( 313 scoped_refptr<MediaDrmBridge> MediaDrmBridge::Create(
310 const std::string& key_system, 314 const std::string& key_system,
315 const GURL& security_origin,
311 SecurityLevel security_level, 316 SecurityLevel security_level,
317 MediaPermission* media_permission,
312 const CreateFetcherCB& create_fetcher_cb, 318 const CreateFetcherCB& create_fetcher_cb,
313 const SessionMessageCB& session_message_cb, 319 const SessionMessageCB& session_message_cb,
314 const SessionClosedCB& session_closed_cb, 320 const SessionClosedCB& session_closed_cb,
315 const LegacySessionErrorCB& legacy_session_error_cb, 321 const LegacySessionErrorCB& legacy_session_error_cb,
316 const SessionKeysChangeCB& session_keys_change_cb, 322 const SessionKeysChangeCB& session_keys_change_cb,
317 const SessionExpirationUpdateCB& session_expiration_update_cb) { 323 const SessionExpirationUpdateCB& session_expiration_update_cb) {
318 DVLOG(1) << __FUNCTION__; 324 DVLOG(1) << __FUNCTION__;
319 325
320 if (!IsAvailable()) 326 if (!IsAvailable())
321 return nullptr; 327 return nullptr;
322 328
323 return CreateInternal(key_system, security_level, create_fetcher_cb, 329 return CreateInternal(key_system, security_origin, security_level,
324 session_message_cb, session_closed_cb, 330 media_permission, create_fetcher_cb, session_message_cb,
325 legacy_session_error_cb, session_keys_change_cb, 331 session_closed_cb, legacy_session_error_cb,
326 session_expiration_update_cb); 332 session_keys_change_cb, session_expiration_update_cb);
327 } 333 }
328 334
329 // static 335 // static
330 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport( 336 scoped_refptr<MediaDrmBridge> MediaDrmBridge::CreateWithoutSessionSupport(
331 const std::string& key_system, 337 const std::string& key_system,
332 SecurityLevel security_level, 338 SecurityLevel security_level,
333 const CreateFetcherCB& create_fetcher_cb) { 339 const CreateFetcherCB& create_fetcher_cb) {
334 DVLOG(1) << __FUNCTION__; 340 DVLOG(1) << __FUNCTION__;
335 341
336 // Sessions won't be used so decoding capability is not required. 342 // Sessions won't be used so decoding capability is not required.
337 if (!AreMediaDrmApisAvailable()) 343 if (!AreMediaDrmApisAvailable())
338 return nullptr; 344 return nullptr;
339 345
340 return MediaDrmBridge::Create(key_system, security_level, create_fetcher_cb, 346 return MediaDrmBridge::Create(
341 SessionMessageCB(), SessionClosedCB(), 347 key_system, GURL(), security_level, nullptr, create_fetcher_cb,
342 LegacySessionErrorCB(), SessionKeysChangeCB(), 348 SessionMessageCB(), SessionClosedCB(), LegacySessionErrorCB(),
343 SessionExpirationUpdateCB()); 349 SessionKeysChangeCB(), SessionExpirationUpdateCB());
344 } 350 }
345 351
346 void MediaDrmBridge::SetServerCertificate( 352 void MediaDrmBridge::SetServerCertificate(
347 const std::vector<uint8_t>& certificate, 353 const std::vector<uint8_t>& certificate,
348 scoped_ptr<media::SimpleCdmPromise> promise) { 354 scoped_ptr<SimpleCdmPromise> promise) {
349 DCHECK(task_runner_->BelongsToCurrentThread()); 355 DCHECK(task_runner_->BelongsToCurrentThread());
350 DVLOG(2) << __FUNCTION__ << "(" << certificate.size() << " bytes)"; 356 DVLOG(2) << __FUNCTION__ << "(" << certificate.size() << " bytes)";
351 357
352 DCHECK(!certificate.empty()); 358 DCHECK(!certificate.empty());
353 359
354 JNIEnv* env = AttachCurrentThread(); 360 JNIEnv* env = AttachCurrentThread();
355 ScopedJavaLocalRef<jbyteArray> j_certificate = base::android::ToJavaByteArray( 361 ScopedJavaLocalRef<jbyteArray> j_certificate = base::android::ToJavaByteArray(
356 env, certificate.data(), certificate.size()); 362 env, certificate.data(), certificate.size());
357 if (Java_MediaDrmBridge_setServerCertificate(env, j_media_drm_.obj(), 363 if (Java_MediaDrmBridge_setServerCertificate(env, j_media_drm_.obj(),
358 j_certificate.obj())) { 364 j_certificate.obj())) {
359 promise->resolve(); 365 promise->resolve();
360 } else { 366 } else {
361 promise->reject(INVALID_ACCESS_ERROR, 0, "Set server certificate failed."); 367 promise->reject(INVALID_ACCESS_ERROR, 0, "Set server certificate failed.");
362 } 368 }
363 } 369 }
364 370
365 void MediaDrmBridge::CreateSessionAndGenerateRequest( 371 void MediaDrmBridge::CreateSessionAndGenerateRequest(
366 SessionType session_type, 372 SessionType session_type,
367 media::EmeInitDataType init_data_type, 373 EmeInitDataType init_data_type,
368 const std::vector<uint8_t>& init_data, 374 const std::vector<uint8_t>& init_data,
369 scoped_ptr<media::NewSessionCdmPromise> promise) { 375 scoped_ptr<NewSessionCdmPromise> promise) {
370 DCHECK(task_runner_->BelongsToCurrentThread()); 376 DCHECK(task_runner_->BelongsToCurrentThread());
371 DVLOG(2) << __FUNCTION__; 377 DVLOG(2) << __FUNCTION__;
372 378
373 if (session_type != media::MediaKeys::TEMPORARY_SESSION) { 379 if (session_type != MediaKeys::TEMPORARY_SESSION) {
374 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; 380 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android.";
375 promise->reject(NOT_SUPPORTED_ERROR, 0, 381 promise->reject(NOT_SUPPORTED_ERROR, 0,
376 "Only the temporary session type is supported."); 382 "Only the temporary session type is supported.");
377 return; 383 return;
378 } 384 }
379 385
380 JNIEnv* env = AttachCurrentThread(); 386 // TODO(xhwang): |media_permission_| is optional here because when running
381 ScopedJavaLocalRef<jbyteArray> j_init_data; 387 // in the browser process BrowserCdmManager does the permission check. Make
382 ScopedJavaLocalRef<jobjectArray> j_optional_parameters; 388 // |media_permission_| mandatory when BrowserCdmManager is deprecated.
383 389 // See http://crbug.com/581746
384 MediaClientAndroid* client = GetMediaClientAndroid(); 390 if (!media_permission_) {
385 if (client) { 391 CreateSessionAndGenerateRequestIfPermitted(init_data_type, init_data,
386 MediaDrmBridgeDelegate* delegate = 392 std::move(promise), true);
387 client->GetMediaDrmBridgeDelegate(scheme_uuid_); 393 } else {
388 if (delegate) { 394 media_permission_->HasPermission(
389 std::vector<uint8_t> init_data_from_delegate; 395 MediaPermission::PROTECTED_MEDIA_IDENTIFIER, security_origin_,
390 std::vector<std::string> optional_parameters_from_delegate; 396 base::Bind(&MediaDrmBridge::CreateSessionAndGenerateRequestIfPermitted,
391 if (!delegate->OnCreateSession(init_data_type, init_data, 397 weak_factory_.GetWeakPtr(), init_data_type, init_data,
392 &init_data_from_delegate, 398 base::Passed(&promise)));
393 &optional_parameters_from_delegate)) {
394 promise->reject(INVALID_ACCESS_ERROR, 0, "Invalid init data.");
395 return;
396 }
397 if (!init_data_from_delegate.empty()) {
398 j_init_data =
399 base::android::ToJavaByteArray(env, init_data_from_delegate.data(),
400 init_data_from_delegate.size());
401 }
402 if (!optional_parameters_from_delegate.empty()) {
403 j_optional_parameters = base::android::ToJavaArrayOfStrings(
404 env, optional_parameters_from_delegate);
405 }
406 }
407 } 399 }
408
409 if (j_init_data.is_null()) {
410 j_init_data =
411 base::android::ToJavaByteArray(env, init_data.data(), init_data.size());
412 }
413
414 ScopedJavaLocalRef<jstring> j_mime =
415 ConvertUTF8ToJavaString(env, ConvertInitDataType(init_data_type));
416 uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise));
417 Java_MediaDrmBridge_createSessionFromNative(
418 env, j_media_drm_.obj(), j_init_data.obj(), j_mime.obj(),
419 j_optional_parameters.obj(), promise_id);
420 } 400 }
421 401
422 void MediaDrmBridge::LoadSession( 402 void MediaDrmBridge::LoadSession(SessionType session_type,
423 SessionType session_type, 403 const std::string& session_id,
424 const std::string& session_id, 404 scoped_ptr<NewSessionCdmPromise> promise) {
425 scoped_ptr<media::NewSessionCdmPromise> promise) {
426 DCHECK(task_runner_->BelongsToCurrentThread()); 405 DCHECK(task_runner_->BelongsToCurrentThread());
427 DVLOG(2) << __FUNCTION__; 406 DVLOG(2) << __FUNCTION__;
428 407
429 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; 408 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android.";
430 promise->reject(NOT_SUPPORTED_ERROR, 0, "LoadSession() is not supported."); 409 promise->reject(NOT_SUPPORTED_ERROR, 0, "LoadSession() is not supported.");
431 } 410 }
432 411
433 void MediaDrmBridge::UpdateSession( 412 void MediaDrmBridge::UpdateSession(const std::string& session_id,
434 const std::string& session_id, 413 const std::vector<uint8_t>& response,
435 const std::vector<uint8_t>& response, 414 scoped_ptr<SimpleCdmPromise> promise) {
436 scoped_ptr<media::SimpleCdmPromise> promise) {
437 DCHECK(task_runner_->BelongsToCurrentThread()); 415 DCHECK(task_runner_->BelongsToCurrentThread());
438 DVLOG(2) << __FUNCTION__; 416 DVLOG(2) << __FUNCTION__;
439 417
440 JNIEnv* env = AttachCurrentThread(); 418 JNIEnv* env = AttachCurrentThread();
441 ScopedJavaLocalRef<jbyteArray> j_response = 419 ScopedJavaLocalRef<jbyteArray> j_response =
442 base::android::ToJavaByteArray(env, response.data(), response.size()); 420 base::android::ToJavaByteArray(env, response.data(), response.size());
443 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( 421 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray(
444 env, reinterpret_cast<const uint8_t*>(session_id.data()), 422 env, reinterpret_cast<const uint8_t*>(session_id.data()),
445 session_id.size()); 423 session_id.size());
446 uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); 424 uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise));
447 Java_MediaDrmBridge_updateSession(env, j_media_drm_.obj(), j_session_id.obj(), 425 Java_MediaDrmBridge_updateSession(env, j_media_drm_.obj(), j_session_id.obj(),
448 j_response.obj(), promise_id); 426 j_response.obj(), promise_id);
449 } 427 }
450 428
451 void MediaDrmBridge::CloseSession(const std::string& session_id, 429 void MediaDrmBridge::CloseSession(const std::string& session_id,
452 scoped_ptr<media::SimpleCdmPromise> promise) { 430 scoped_ptr<SimpleCdmPromise> promise) {
453 DCHECK(task_runner_->BelongsToCurrentThread()); 431 DCHECK(task_runner_->BelongsToCurrentThread());
454 DVLOG(2) << __FUNCTION__; 432 DVLOG(2) << __FUNCTION__;
455 433
456 JNIEnv* env = AttachCurrentThread(); 434 JNIEnv* env = AttachCurrentThread();
457 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( 435 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray(
458 env, reinterpret_cast<const uint8_t*>(session_id.data()), 436 env, reinterpret_cast<const uint8_t*>(session_id.data()),
459 session_id.size()); 437 session_id.size());
460 uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); 438 uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise));
461 Java_MediaDrmBridge_closeSession(env, j_media_drm_.obj(), j_session_id.obj(), 439 Java_MediaDrmBridge_closeSession(env, j_media_drm_.obj(), j_session_id.obj(),
462 promise_id); 440 promise_id);
463 } 441 }
464 442
465 void MediaDrmBridge::RemoveSession( 443 void MediaDrmBridge::RemoveSession(const std::string& session_id,
466 const std::string& session_id, 444 scoped_ptr<SimpleCdmPromise> promise) {
467 scoped_ptr<media::SimpleCdmPromise> promise) {
468 DCHECK(task_runner_->BelongsToCurrentThread()); 445 DCHECK(task_runner_->BelongsToCurrentThread());
469 DVLOG(2) << __FUNCTION__; 446 DVLOG(2) << __FUNCTION__;
470 447
471 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; 448 NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android.";
472 promise->reject(NOT_SUPPORTED_ERROR, 0, "RemoveSession() is not supported."); 449 promise->reject(NOT_SUPPORTED_ERROR, 0, "RemoveSession() is not supported.");
473 } 450 }
474 451
475 CdmContext* MediaDrmBridge::GetCdmContext() { 452 CdmContext* MediaDrmBridge::GetCdmContext() {
476 DVLOG(2) << __FUNCTION__; 453 DVLOG(2) << __FUNCTION__;
477 454
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
755 task_runner_->PostTask( 732 task_runner_->PostTask(
756 FROM_HERE, 733 FROM_HERE,
757 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success)); 734 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success));
758 } 735 }
759 736
760 //------------------------------------------------------------------------------ 737 //------------------------------------------------------------------------------
761 // The following are private methods. 738 // The following are private methods.
762 739
763 MediaDrmBridge::MediaDrmBridge( 740 MediaDrmBridge::MediaDrmBridge(
764 const std::vector<uint8_t>& scheme_uuid, 741 const std::vector<uint8_t>& scheme_uuid,
742 const GURL& security_origin,
765 SecurityLevel security_level, 743 SecurityLevel security_level,
744 MediaPermission* media_permission,
766 const CreateFetcherCB& create_fetcher_cb, 745 const CreateFetcherCB& create_fetcher_cb,
767 const SessionMessageCB& session_message_cb, 746 const SessionMessageCB& session_message_cb,
768 const SessionClosedCB& session_closed_cb, 747 const SessionClosedCB& session_closed_cb,
769 const LegacySessionErrorCB& legacy_session_error_cb, 748 const LegacySessionErrorCB& legacy_session_error_cb,
770 const SessionKeysChangeCB& session_keys_change_cb, 749 const SessionKeysChangeCB& session_keys_change_cb,
771 const SessionExpirationUpdateCB& session_expiration_update_cb) 750 const SessionExpirationUpdateCB& session_expiration_update_cb)
772 : scheme_uuid_(scheme_uuid), 751 : scheme_uuid_(scheme_uuid),
752 security_origin_(security_origin),
753 media_permission_(media_permission),
773 create_fetcher_cb_(create_fetcher_cb), 754 create_fetcher_cb_(create_fetcher_cb),
774 session_message_cb_(session_message_cb), 755 session_message_cb_(session_message_cb),
775 session_closed_cb_(session_closed_cb), 756 session_closed_cb_(session_closed_cb),
776 legacy_session_error_cb_(legacy_session_error_cb), 757 legacy_session_error_cb_(legacy_session_error_cb),
777 session_keys_change_cb_(session_keys_change_cb), 758 session_keys_change_cb_(session_keys_change_cb),
778 session_expiration_update_cb_(session_expiration_update_cb), 759 session_expiration_update_cb_(session_expiration_update_cb),
779 task_runner_(base::ThreadTaskRunnerHandle::Get()), 760 task_runner_(base::ThreadTaskRunnerHandle::Get()),
780 media_drm_bridge_cdm_context_(this), 761 media_drm_bridge_cdm_context_(this),
781 weak_factory_(this) { 762 weak_factory_(this) {
782 DVLOG(1) << __FUNCTION__; 763 DVLOG(1) << __FUNCTION__;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 j_media_crypto_ = std::move(j_media_crypto); 836 j_media_crypto_ = std::move(j_media_crypto);
856 837
857 if (media_crypto_ready_cb_.is_null()) 838 if (media_crypto_ready_cb_.is_null())
858 return; 839 return;
859 840
860 base::ResetAndReturn(&media_crypto_ready_cb_) 841 base::ResetAndReturn(&media_crypto_ready_cb_)
861 .Run(CreateJavaObjectPtr(j_media_crypto_->obj()), 842 .Run(CreateJavaObjectPtr(j_media_crypto_->obj()),
862 IsProtectedSurfaceRequired()); 843 IsProtectedSurfaceRequired());
863 } 844 }
864 845
846 void MediaDrmBridge::CreateSessionAndGenerateRequestIfPermitted(
847 EmeInitDataType init_data_type,
848 const std::vector<uint8_t>& init_data,
849 scoped_ptr<NewSessionCdmPromise> promise,
850 bool permitted) {
851 if (!permitted) {
852 promise->reject(MediaKeys::NOT_SUPPORTED_ERROR, 0, "Permission denied.");
853 return;
854 }
855
856 JNIEnv* env = AttachCurrentThread();
857 ScopedJavaLocalRef<jbyteArray> j_init_data;
858 ScopedJavaLocalRef<jobjectArray> j_optional_parameters;
859
860 MediaClientAndroid* client = GetMediaClientAndroid();
861 if (client) {
862 MediaDrmBridgeDelegate* delegate =
863 client->GetMediaDrmBridgeDelegate(scheme_uuid_);
864 if (delegate) {
865 std::vector<uint8_t> init_data_from_delegate;
866 std::vector<std::string> optional_parameters_from_delegate;
867 if (!delegate->OnCreateSession(init_data_type, init_data,
868 &init_data_from_delegate,
869 &optional_parameters_from_delegate)) {
870 promise->reject(INVALID_ACCESS_ERROR, 0, "Invalid init data.");
871 return;
872 }
873 if (!init_data_from_delegate.empty()) {
874 j_init_data =
875 base::android::ToJavaByteArray(env, init_data_from_delegate.data(),
876 init_data_from_delegate.size());
877 }
878 if (!optional_parameters_from_delegate.empty()) {
879 j_optional_parameters = base::android::ToJavaArrayOfStrings(
880 env, optional_parameters_from_delegate);
881 }
882 }
883 }
884
885 if (j_init_data.is_null()) {
886 j_init_data =
887 base::android::ToJavaByteArray(env, init_data.data(), init_data.size());
888 }
889
890 ScopedJavaLocalRef<jstring> j_mime =
891 ConvertUTF8ToJavaString(env, ConvertInitDataType(init_data_type));
892 uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise));
893 Java_MediaDrmBridge_createSessionFromNative(
894 env, j_media_drm_.obj(), j_init_data.obj(), j_mime.obj(),
895 j_optional_parameters.obj(), promise_id);
896 }
897
865 void MediaDrmBridge::SendProvisioningRequest(const std::string& default_url, 898 void MediaDrmBridge::SendProvisioningRequest(const std::string& default_url,
866 const std::string& request_data) { 899 const std::string& request_data) {
867 DCHECK(task_runner_->BelongsToCurrentThread()); 900 DCHECK(task_runner_->BelongsToCurrentThread());
868 DVLOG(1) << __FUNCTION__; 901 DVLOG(1) << __FUNCTION__;
869 902
870 DCHECK(!provision_fetcher_) << "At most one provision request at any time."; 903 DCHECK(!provision_fetcher_) << "At most one provision request at any time.";
871 provision_fetcher_ = create_fetcher_cb_.Run(); 904 provision_fetcher_ = create_fetcher_cb_.Run();
872 905
873 provision_fetcher_->Retrieve( 906 provision_fetcher_->Retrieve(
874 default_url, request_data, 907 default_url, request_data,
(...skipping 22 matching lines...) Expand all
897 } 930 }
898 931
899 void MediaDrmBridge::OnHasAdditionalUsableKey() { 932 void MediaDrmBridge::OnHasAdditionalUsableKey() {
900 DCHECK(task_runner_->BelongsToCurrentThread()); 933 DCHECK(task_runner_->BelongsToCurrentThread());
901 DVLOG(1) << __FUNCTION__; 934 DVLOG(1) << __FUNCTION__;
902 935
903 player_tracker_.NotifyNewKey(); 936 player_tracker_.NotifyNewKey();
904 } 937 }
905 938
906 } // namespace media 939 } // namespace media
OLDNEW
« no previous file with comments | « media/base/android/media_drm_bridge.h ('k') | media/mojo/services/android_mojo_media_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698