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 <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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |