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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 KEY_STATUS_INTERNAL_ERROR = 4, | 58 KEY_STATUS_INTERNAL_ERROR = 4, |
59 }; | 59 }; |
60 | 60 |
61 // Converts jbyteArray (byte[] in Java) into std::string. | 61 // Converts jbyteArray (byte[] in Java) into std::string. |
62 std::string AsString(JNIEnv* env, jbyteArray j_byte_array) { | 62 std::string AsString(JNIEnv* env, jbyteArray j_byte_array) { |
63 std::vector<uint8_t> byte_vector; | 63 std::vector<uint8_t> byte_vector; |
64 JavaByteArrayToByteVector(env, j_byte_array, &byte_vector); | 64 JavaByteArrayToByteVector(env, j_byte_array, &byte_vector); |
65 return std::string(byte_vector.begin(), byte_vector.end()); | 65 return std::string(byte_vector.begin(), byte_vector.end()); |
66 } | 66 } |
67 | 67 |
68 const uint8 kWidevineUuid[16] = { | 68 const uint8_t kWidevineUuid[16] = { |
69 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, // | 69 0xED, 0xEF, 0x8B, 0xA9, 0x79, 0xD6, 0x4A, 0xCE, // |
70 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED}; | 70 0xA3, 0xC8, 0x27, 0xDC, 0xD5, 0x1D, 0x21, 0xED}; |
71 | 71 |
72 // Convert |init_data_type| to a string supported by MediaDRM. | 72 // Convert |init_data_type| to a string supported by MediaDRM. |
73 // "audio"/"video" does not matter, so use "video". | 73 // "audio"/"video" does not matter, so use "video". |
74 std::string ConvertInitDataType(media::EmeInitDataType init_data_type) { | 74 std::string ConvertInitDataType(media::EmeInitDataType init_data_type) { |
75 // TODO(jrummell/xhwang): EME init data types like "webm" and "cenc" are | 75 // TODO(jrummell/xhwang): EME init data types like "webm" and "cenc" are |
76 // supported in API level >=21 for Widevine key system. Switch to use those | 76 // supported in API level >=21 for Widevine key system. Switch to use those |
77 // strings when they are officially supported in Android for all key systems. | 77 // strings when they are officially supported in Android for all key systems. |
78 switch (init_data_type) { | 78 switch (init_data_type) { |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 return ""; | 213 return ""; |
214 } | 214 } |
215 | 215 |
216 } // namespace | 216 } // namespace |
217 | 217 |
218 // static | 218 // static |
219 bool MediaDrmBridge::IsAvailable() { | 219 bool MediaDrmBridge::IsAvailable() { |
220 if (base::android::BuildInfo::GetInstance()->sdk_int() < 19) | 220 if (base::android::BuildInfo::GetInstance()->sdk_int() < 19) |
221 return false; | 221 return false; |
222 | 222 |
223 int32 os_major_version = 0; | 223 int32_t os_major_version = 0; |
224 int32 os_minor_version = 0; | 224 int32_t os_minor_version = 0; |
225 int32 os_bugfix_version = 0; | 225 int32_t os_bugfix_version = 0; |
226 base::SysInfo::OperatingSystemVersionNumbers( | 226 base::SysInfo::OperatingSystemVersionNumbers( |
227 &os_major_version, &os_minor_version, &os_bugfix_version); | 227 &os_major_version, &os_minor_version, &os_bugfix_version); |
228 if (os_major_version == 4 && os_minor_version == 4 && os_bugfix_version == 0) | 228 if (os_major_version == 4 && os_minor_version == 4 && os_bugfix_version == 0) |
229 return false; | 229 return false; |
230 | 230 |
231 return true; | 231 return true; |
232 } | 232 } |
233 | 233 |
234 // static | 234 // static |
235 bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { | 235 bool MediaDrmBridge::RegisterMediaDrmBridge(JNIEnv* env) { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
329 | 329 |
330 JNIEnv* env = AttachCurrentThread(); | 330 JNIEnv* env = AttachCurrentThread(); |
331 ScopedJavaLocalRef<jbyteArray> j_init_data; | 331 ScopedJavaLocalRef<jbyteArray> j_init_data; |
332 ScopedJavaLocalRef<jobjectArray> j_optional_parameters; | 332 ScopedJavaLocalRef<jobjectArray> j_optional_parameters; |
333 | 333 |
334 MediaClientAndroid* client = GetMediaClientAndroid(); | 334 MediaClientAndroid* client = GetMediaClientAndroid(); |
335 if (client) { | 335 if (client) { |
336 MediaDrmBridgeDelegate* delegate = | 336 MediaDrmBridgeDelegate* delegate = |
337 client->GetMediaDrmBridgeDelegate(scheme_uuid_); | 337 client->GetMediaDrmBridgeDelegate(scheme_uuid_); |
338 if (delegate) { | 338 if (delegate) { |
339 std::vector<uint8> init_data_from_delegate; | 339 std::vector<uint8_t> init_data_from_delegate; |
340 std::vector<std::string> optional_parameters_from_delegate; | 340 std::vector<std::string> optional_parameters_from_delegate; |
341 if (!delegate->OnCreateSession(init_data_type, init_data, | 341 if (!delegate->OnCreateSession(init_data_type, init_data, |
342 &init_data_from_delegate, | 342 &init_data_from_delegate, |
343 &optional_parameters_from_delegate)) { | 343 &optional_parameters_from_delegate)) { |
344 promise->reject(INVALID_ACCESS_ERROR, 0, "Invalid init data."); | 344 promise->reject(INVALID_ACCESS_ERROR, 0, "Invalid init data."); |
345 } | 345 } |
346 if (!init_data_from_delegate.empty()) { | 346 if (!init_data_from_delegate.empty()) { |
347 j_init_data = | 347 j_init_data = |
348 base::android::ToJavaByteArray(env, init_data_from_delegate.data(), | 348 base::android::ToJavaByteArray(env, init_data_from_delegate.data(), |
349 init_data_from_delegate.size()); | 349 init_data_from_delegate.size()); |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 | 573 |
574 void MediaDrmBridge::OnSessionMessage( | 574 void MediaDrmBridge::OnSessionMessage( |
575 JNIEnv* env, | 575 JNIEnv* env, |
576 const JavaParamRef<jobject>& j_media_drm, | 576 const JavaParamRef<jobject>& j_media_drm, |
577 const JavaParamRef<jbyteArray>& j_session_id, | 577 const JavaParamRef<jbyteArray>& j_session_id, |
578 jint j_message_type, | 578 jint j_message_type, |
579 const JavaParamRef<jbyteArray>& j_message, | 579 const JavaParamRef<jbyteArray>& j_message, |
580 const JavaParamRef<jstring>& j_legacy_destination_url) { | 580 const JavaParamRef<jstring>& j_legacy_destination_url) { |
581 DVLOG(2) << __FUNCTION__; | 581 DVLOG(2) << __FUNCTION__; |
582 | 582 |
583 std::vector<uint8> message; | 583 std::vector<uint8_t> message; |
584 JavaByteArrayToByteVector(env, j_message, &message); | 584 JavaByteArrayToByteVector(env, j_message, &message); |
585 GURL legacy_destination_url = | 585 GURL legacy_destination_url = |
586 GURL(ConvertJavaStringToUTF8(env, j_legacy_destination_url)); | 586 GURL(ConvertJavaStringToUTF8(env, j_legacy_destination_url)); |
587 MediaKeys::MessageType message_type = | 587 MediaKeys::MessageType message_type = |
588 GetMessageType(static_cast<RequestType>(j_message_type)); | 588 GetMessageType(static_cast<RequestType>(j_message_type)); |
589 | 589 |
590 task_runner_->PostTask( | 590 task_runner_->PostTask( |
591 FROM_HERE, base::Bind(session_message_cb_, AsString(env, j_session_id), | 591 FROM_HERE, base::Bind(session_message_cb_, AsString(env, j_session_id), |
592 message_type, message, legacy_destination_url)); | 592 message_type, message, legacy_destination_url)); |
593 } | 593 } |
(...skipping 22 matching lines...) Expand all Loading... |
616 | 616 |
617 size_t size = env->GetArrayLength(j_keys_info); | 617 size_t size = env->GetArrayLength(j_keys_info); |
618 DCHECK_GT(size, 0u); | 618 DCHECK_GT(size, 0u); |
619 | 619 |
620 for (size_t i = 0; i < size; ++i) { | 620 for (size_t i = 0; i < size; ++i) { |
621 ScopedJavaLocalRef<jobject> j_key_status( | 621 ScopedJavaLocalRef<jobject> j_key_status( |
622 env, env->GetObjectArrayElement(j_keys_info, i)); | 622 env, env->GetObjectArrayElement(j_keys_info, i)); |
623 | 623 |
624 ScopedJavaLocalRef<jbyteArray> j_key_id = | 624 ScopedJavaLocalRef<jbyteArray> j_key_id = |
625 Java_KeyStatus_getKeyId(env, j_key_status.obj()); | 625 Java_KeyStatus_getKeyId(env, j_key_status.obj()); |
626 std::vector<uint8> key_id; | 626 std::vector<uint8_t> key_id; |
627 JavaByteArrayToByteVector(env, j_key_id.obj(), &key_id); | 627 JavaByteArrayToByteVector(env, j_key_id.obj(), &key_id); |
628 DCHECK(!key_id.empty()); | 628 DCHECK(!key_id.empty()); |
629 | 629 |
630 jint j_status_code = Java_KeyStatus_getStatusCode(env, j_key_status.obj()); | 630 jint j_status_code = Java_KeyStatus_getStatusCode(env, j_key_status.obj()); |
631 CdmKeyInformation::KeyStatus key_status = | 631 CdmKeyInformation::KeyStatus key_status = |
632 ConvertKeyStatus(static_cast<KeyStatus>(j_status_code)); | 632 ConvertKeyStatus(static_cast<KeyStatus>(j_status_code)); |
633 | 633 |
634 DVLOG(2) << __FUNCTION__ << "Key status change: " | 634 DVLOG(2) << __FUNCTION__ << "Key status change: " |
635 << base::HexEncode(&key_id[0], key_id.size()) << ", " | 635 << base::HexEncode(&key_id[0], key_id.size()) << ", " |
636 << key_status; | 636 << key_status; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 DCHECK(!reset_credentials_cb_.is_null()); | 690 DCHECK(!reset_credentials_cb_.is_null()); |
691 task_runner_->PostTask( | 691 task_runner_->PostTask( |
692 FROM_HERE, | 692 FROM_HERE, |
693 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success)); | 693 base::Bind(base::ResetAndReturn(&reset_credentials_cb_), success)); |
694 } | 694 } |
695 | 695 |
696 //------------------------------------------------------------------------------ | 696 //------------------------------------------------------------------------------ |
697 // The following are private methods. | 697 // The following are private methods. |
698 | 698 |
699 MediaDrmBridge::MediaDrmBridge( | 699 MediaDrmBridge::MediaDrmBridge( |
700 const std::vector<uint8>& scheme_uuid, | 700 const std::vector<uint8_t>& scheme_uuid, |
701 SecurityLevel security_level, | 701 SecurityLevel security_level, |
702 const CreateFetcherCB& create_fetcher_cb, | 702 const CreateFetcherCB& create_fetcher_cb, |
703 const SessionMessageCB& session_message_cb, | 703 const SessionMessageCB& session_message_cb, |
704 const SessionClosedCB& session_closed_cb, | 704 const SessionClosedCB& session_closed_cb, |
705 const LegacySessionErrorCB& legacy_session_error_cb, | 705 const LegacySessionErrorCB& legacy_session_error_cb, |
706 const SessionKeysChangeCB& session_keys_change_cb, | 706 const SessionKeysChangeCB& session_keys_change_cb, |
707 const SessionExpirationUpdateCB& session_expiration_update_cb) | 707 const SessionExpirationUpdateCB& session_expiration_update_cb) |
708 : scheme_uuid_(scheme_uuid), | 708 : scheme_uuid_(scheme_uuid), |
709 create_fetcher_cb_(create_fetcher_cb), | 709 create_fetcher_cb_(create_fetcher_cb), |
710 session_message_cb_(session_message_cb), | 710 session_message_cb_(session_message_cb), |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
824 JNIEnv* env = AttachCurrentThread(); | 824 JNIEnv* env = AttachCurrentThread(); |
825 | 825 |
826 ScopedJavaLocalRef<jbyteArray> j_response = base::android::ToJavaByteArray( | 826 ScopedJavaLocalRef<jbyteArray> j_response = base::android::ToJavaByteArray( |
827 env, reinterpret_cast<const uint8_t*>(response.data()), response.size()); | 827 env, reinterpret_cast<const uint8_t*>(response.data()), response.size()); |
828 | 828 |
829 Java_MediaDrmBridge_processProvisionResponse(env, j_media_drm_.obj(), success, | 829 Java_MediaDrmBridge_processProvisionResponse(env, j_media_drm_.obj(), success, |
830 j_response.obj()); | 830 j_response.obj()); |
831 } | 831 } |
832 | 832 |
833 } // namespace media | 833 } // namespace media |
OLD | NEW |