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

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

Issue 1072403009: Use std::vector<uint8_t> instead of uint8*/int for MediaKeys interface (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add includes Created 5 years, 8 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
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"
11 #include "base/android/jni_string.h" 11 #include "base/android/jni_string.h"
12 #include "base/callback_helpers.h" 12 #include "base/callback_helpers.h"
13 #include "base/containers/hash_tables.h" 13 #include "base/containers/hash_tables.h"
14 #include "base/lazy_instance.h" 14 #include "base/lazy_instance.h"
15 #include "base/location.h" 15 #include "base/location.h"
16 #include "base/logging.h" 16 #include "base/logging.h"
17 #include "base/message_loop/message_loop_proxy.h" 17 #include "base/message_loop/message_loop_proxy.h"
18 #include "base/stl_util.h"
18 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
19 #include "base/sys_byteorder.h" 20 #include "base/sys_byteorder.h"
20 #include "base/sys_info.h" 21 #include "base/sys_info.h"
21 #include "jni/MediaDrmBridge_jni.h" 22 #include "jni/MediaDrmBridge_jni.h"
22 #include "media/base/cdm_key_information.h" 23 #include "media/base/cdm_key_information.h"
23 24
24 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. 25 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR.
25 26
26 using base::android::AttachCurrentThread; 27 using base::android::AttachCurrentThread;
27 using base::android::ConvertUTF8ToJavaString; 28 using base::android::ConvertUTF8ToJavaString;
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 86
86 typedef std::vector<uint8> UUID; 87 typedef std::vector<uint8> UUID;
87 88
88 // Tries to find a PSSH box whose "SystemId" is |uuid| in |data|, parses the 89 // Tries to find a PSSH box whose "SystemId" is |uuid| in |data|, parses the
89 // "Data" of the box and put it in |pssh_data|. Returns true if such a box is 90 // "Data" of the box and put it in |pssh_data|. Returns true if such a box is
90 // found and successfully parsed. Returns false otherwise. 91 // found and successfully parsed. Returns false otherwise.
91 // Notes: 92 // Notes:
92 // 1, If multiple PSSH boxes are found,the "Data" of the first matching PSSH box 93 // 1, If multiple PSSH boxes are found,the "Data" of the first matching PSSH box
93 // will be set in |pssh_data|. 94 // will be set in |pssh_data|.
94 // 2, Only PSSH and TENC boxes are allowed in |data|. TENC boxes are skipped. 95 // 2, Only PSSH and TENC boxes are allowed in |data|. TENC boxes are skipped.
95 bool GetPsshData(const uint8* data, 96 bool GetPsshData(const std::vector<uint8_t>& data,
96 int data_size,
97 const UUID& uuid, 97 const UUID& uuid,
98 std::vector<uint8>* pssh_data) { 98 std::vector<uint8>* pssh_data) {
99 const uint8* cur = data; 99 int bytes_left = data.size();
100 const uint8* data_end = data + data_size; 100 const uint8_t* cur = &data[0];
101 int bytes_left = data_size; 101 const uint8_t* data_end = cur + bytes_left;
102 102
103 while (bytes_left > 0) { 103 while (bytes_left > 0) {
104 const uint8* box_head = cur; 104 const uint8* box_head = cur;
105 105
106 if (bytes_left < kBoxHeaderSize) 106 if (bytes_left < kBoxHeaderSize)
107 return false; 107 return false;
108 108
109 uint64_t box_size = ReadUint32(cur); 109 uint64_t box_size = ReadUint32(cur);
110 uint32 type = ReadUint32(cur + 4); 110 uint32 type = ReadUint32(cur + 4);
111 cur += kBoxHeaderSize; 111 cur += kBoxHeaderSize;
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 if (security_level_str.empty()) 420 if (security_level_str.empty())
421 return false; 421 return false;
422 422
423 ScopedJavaLocalRef<jstring> j_security_level = 423 ScopedJavaLocalRef<jstring> j_security_level =
424 ConvertUTF8ToJavaString(env, security_level_str); 424 ConvertUTF8ToJavaString(env, security_level_str);
425 return Java_MediaDrmBridge_setSecurityLevel( 425 return Java_MediaDrmBridge_setSecurityLevel(
426 env, j_media_drm_.obj(), j_security_level.obj()); 426 env, j_media_drm_.obj(), j_security_level.obj());
427 } 427 }
428 428
429 void MediaDrmBridge::SetServerCertificate( 429 void MediaDrmBridge::SetServerCertificate(
430 const uint8* certificate_data, 430 const std::vector<uint8_t>& certificate,
431 int certificate_data_length,
432 scoped_ptr<media::SimpleCdmPromise> promise) { 431 scoped_ptr<media::SimpleCdmPromise> promise) {
433 promise->reject(NOT_SUPPORTED_ERROR, 0, 432 promise->reject(NOT_SUPPORTED_ERROR, 0,
434 "SetServerCertificate() is not supported."); 433 "SetServerCertificate() is not supported.");
435 } 434 }
436 435
437 void MediaDrmBridge::CreateSessionAndGenerateRequest( 436 void MediaDrmBridge::CreateSessionAndGenerateRequest(
438 SessionType session_type, 437 SessionType session_type,
439 media::EmeInitDataType init_data_type, 438 media::EmeInitDataType init_data_type,
440 const uint8* init_data, 439 const std::vector<uint8_t>& init_data,
441 int init_data_length,
442 scoped_ptr<media::NewSessionCdmPromise> promise) { 440 scoped_ptr<media::NewSessionCdmPromise> promise) {
443 DVLOG(1) << __FUNCTION__; 441 DVLOG(1) << __FUNCTION__;
444 442
445 if (session_type != media::MediaKeys::TEMPORARY_SESSION) { 443 if (session_type != media::MediaKeys::TEMPORARY_SESSION) {
446 promise->reject(NOT_SUPPORTED_ERROR, 0, 444 promise->reject(NOT_SUPPORTED_ERROR, 0,
447 "Only the temporary session type is supported."); 445 "Only the temporary session type is supported.");
448 return; 446 return;
449 } 447 }
450 448
451 JNIEnv* env = AttachCurrentThread(); 449 JNIEnv* env = AttachCurrentThread();
452 ScopedJavaLocalRef<jbyteArray> j_init_data; 450 ScopedJavaLocalRef<jbyteArray> j_init_data;
453 451
454 // Widevine MediaDrm plugin only accepts the "data" part of the PSSH box as 452 // Widevine MediaDrm plugin only accepts the "data" part of the PSSH box as
455 // the init data when using MP4 container. 453 // the init data when using MP4 container.
456 if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid) && 454 if (std::equal(scheme_uuid_.begin(), scheme_uuid_.end(), kWidevineUuid) &&
457 init_data_type == media::EmeInitDataType::CENC) { 455 init_data_type == media::EmeInitDataType::CENC) {
458 std::vector<uint8> pssh_data; 456 std::vector<uint8> pssh_data;
459 if (!GetPsshData(init_data, init_data_length, scheme_uuid_, &pssh_data)) { 457 if (!GetPsshData(init_data, scheme_uuid_, &pssh_data)) {
460 promise->reject(INVALID_ACCESS_ERROR, 0, "Invalid PSSH data."); 458 promise->reject(INVALID_ACCESS_ERROR, 0, "Invalid PSSH data.");
461 return; 459 return;
462 } 460 }
463 j_init_data = 461 j_init_data = base::android::ToJavaByteArray(
464 base::android::ToJavaByteArray(env, &pssh_data[0], pssh_data.size()); 462 env, vector_as_array(&pssh_data), pssh_data.size());
465 } else { 463 } else {
466 j_init_data = 464 j_init_data = base::android::ToJavaByteArray(
467 base::android::ToJavaByteArray(env, init_data, init_data_length); 465 env, vector_as_array(&init_data), init_data.size());
468 } 466 }
469 467
470 ScopedJavaLocalRef<jstring> j_mime = 468 ScopedJavaLocalRef<jstring> j_mime =
471 ConvertUTF8ToJavaString(env, ConvertInitDataType(init_data_type)); 469 ConvertUTF8ToJavaString(env, ConvertInitDataType(init_data_type));
472 uint32_t promise_id = cdm_promise_adapter_.SavePromise(promise.Pass()); 470 uint32_t promise_id = cdm_promise_adapter_.SavePromise(promise.Pass());
473 Java_MediaDrmBridge_createSession(env, j_media_drm_.obj(), j_init_data.obj(), 471 Java_MediaDrmBridge_createSession(env, j_media_drm_.obj(), j_init_data.obj(),
474 j_mime.obj(), promise_id); 472 j_mime.obj(), promise_id);
475 } 473 }
476 474
477 void MediaDrmBridge::LoadSession( 475 void MediaDrmBridge::LoadSession(
478 SessionType session_type, 476 SessionType session_type,
479 const std::string& session_id, 477 const std::string& session_id,
480 scoped_ptr<media::NewSessionCdmPromise> promise) { 478 scoped_ptr<media::NewSessionCdmPromise> promise) {
481 promise->reject(NOT_SUPPORTED_ERROR, 0, "LoadSession() is not supported."); 479 promise->reject(NOT_SUPPORTED_ERROR, 0, "LoadSession() is not supported.");
482 } 480 }
483 481
484 void MediaDrmBridge::UpdateSession( 482 void MediaDrmBridge::UpdateSession(
485 const std::string& session_id, 483 const std::string& session_id,
486 const uint8* response, 484 const std::vector<uint8_t>& response,
487 int response_length,
488 scoped_ptr<media::SimpleCdmPromise> promise) { 485 scoped_ptr<media::SimpleCdmPromise> promise) {
489 DVLOG(1) << __FUNCTION__; 486 DVLOG(1) << __FUNCTION__;
490 487
491 JNIEnv* env = AttachCurrentThread(); 488 JNIEnv* env = AttachCurrentThread();
492 ScopedJavaLocalRef<jbyteArray> j_response = 489 ScopedJavaLocalRef<jbyteArray> j_response = base::android::ToJavaByteArray(
493 base::android::ToJavaByteArray(env, response, response_length); 490 env, vector_as_array(&response), response.size());
494 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( 491 ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray(
495 env, reinterpret_cast<const uint8_t*>(session_id.data()), 492 env, reinterpret_cast<const uint8_t*>(session_id.data()),
496 session_id.size()); 493 session_id.size());
497 uint32_t promise_id = cdm_promise_adapter_.SavePromise(promise.Pass()); 494 uint32_t promise_id = cdm_promise_adapter_.SavePromise(promise.Pass());
498 Java_MediaDrmBridge_updateSession(env, j_media_drm_.obj(), j_session_id.obj(), 495 Java_MediaDrmBridge_updateSession(env, j_media_drm_.obj(), j_session_id.obj(),
499 j_response.obj(), promise_id); 496 j_response.obj(), promise_id);
500 } 497 }
501 498
502 void MediaDrmBridge::CloseSession(const std::string& session_id, 499 void MediaDrmBridge::CloseSession(const std::string& session_id,
503 scoped_ptr<media::SimpleCdmPromise> promise) { 500 scoped_ptr<media::SimpleCdmPromise> promise) {
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 JNIEnv* env = AttachCurrentThread(); 656 JNIEnv* env = AttachCurrentThread();
660 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj()); 657 Java_MediaDrmBridge_resetDeviceCredentials(env, j_media_drm_.obj());
661 } 658 }
662 659
663 void MediaDrmBridge::OnResetDeviceCredentialsCompleted( 660 void MediaDrmBridge::OnResetDeviceCredentialsCompleted(
664 JNIEnv* env, jobject, bool success) { 661 JNIEnv* env, jobject, bool success) {
665 base::ResetAndReturn(&reset_credentials_cb_).Run(success); 662 base::ResetAndReturn(&reset_credentials_cb_).Run(success);
666 } 663 }
667 664
668 } // namespace media 665 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698