Chromium Code Reviews| Index: media/base/android/media_drm_bridge.cc |
| diff --git a/media/base/android/media_drm_bridge.cc b/media/base/android/media_drm_bridge.cc |
| index 83b14ae185b0d04bb7ccc4063daeb70fc25f4035..ff29caace44b2eb52aa19f71a4a39580a77d23bd 100644 |
| --- a/media/base/android/media_drm_bridge.cc |
| +++ b/media/base/android/media_drm_bridge.cc |
| @@ -124,12 +124,14 @@ ContentDecryptionModule::MessageType GetMessageType(RequestType request_type) { |
| return ContentDecryptionModule::LICENSE_REQUEST; |
| } |
| -CdmKeyInformation::KeyStatus ConvertKeyStatus(KeyStatus key_status) { |
| +CdmKeyInformation::KeyStatus ConvertKeyStatus(KeyStatus key_status, |
| + bool is_key_release) { |
| switch (key_status) { |
| case KeyStatus::KEY_STATUS_USABLE: |
| return CdmKeyInformation::USABLE; |
| case KeyStatus::KEY_STATUS_EXPIRED: |
| - return CdmKeyInformation::EXPIRED; |
| + return is_key_release ? CdmKeyInformation::RELEASED |
| + : CdmKeyInformation::EXPIRED; |
| case KeyStatus::KEY_STATUS_OUTPUT_NOT_ALLOWED: |
| return CdmKeyInformation::OUTPUT_RESTRICTED; |
| case KeyStatus::KEY_STATUS_PENDING: |
| @@ -256,6 +258,12 @@ bool AreMediaDrmApisAvailable() { |
| return true; |
| } |
| +bool IsPersistentLicenseTypeSupportedByMediaDrm() { |
| + return MediaDrmBridge::IsAvailable() && |
| + base::FeatureList::IsEnabled(kMediaDrmPersistentLicense) && |
| + base::android::BuildInfo::GetInstance()->sdk_int() >= 23; |
| +} |
| + |
| } // namespace |
| // MediaDrm is not generally usable without MediaCodec. Thus, both the MediaDrm |
| @@ -281,13 +289,9 @@ bool MediaDrmBridge::IsKeySystemSupported(const std::string& key_system) { |
| // static |
| bool MediaDrmBridge::IsPersistentLicenseTypeSupported( |
| const std::string& key_system) { |
| - if (!MediaDrmBridge::IsAvailable()) |
| + if (!IsPersistentLicenseTypeSupportedByMediaDrm()) |
| return false; |
| - if (!base::FeatureList::IsEnabled(kMediaDrmPersistentLicense)) { |
| - return false; |
| - } |
| - |
| NOTIMPLEMENTED() << "In development. See http://crbug.com/493521"; |
|
xhwang
2017/04/06 04:41:30
You can move this to a comment on line 263. Then t
yucliu1
2017/04/06 16:47:24
Done.
|
| return false; |
| } |
| @@ -460,11 +464,20 @@ void MediaDrmBridge::LoadSession( |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| DVLOG(2) << __func__; |
| - DCHECK(base::FeatureList::IsEnabled(kMediaDrmPersistentLicense)); |
| + DCHECK(IsPersistentLicenseTypeSupportedByMediaDrm()); |
| + |
| + if (session_type != CdmSessionType::PERSISTENT_LICENSE_SESSION) { |
| + promise->reject( |
| + CdmPromise::NOT_SUPPORTED_ERROR, 0, |
| + "LoadSession() is only supported for 'persistent-license'."); |
| + return; |
| + } |
| - NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; |
| - promise->reject(CdmPromise::NOT_SUPPORTED_ERROR, 0, |
| - "LoadSession() is not supported."); |
| + JNIEnv* env = AttachCurrentThread(); |
| + ScopedJavaLocalRef<jbyteArray> j_session_id = |
| + StringToJavaBytes(env, session_id); |
| + uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
| + Java_MediaDrmBridge_loadSession(env, j_media_drm_, j_session_id, promise_id); |
| } |
| void MediaDrmBridge::UpdateSession( |
| @@ -477,9 +490,8 @@ void MediaDrmBridge::UpdateSession( |
| JNIEnv* env = AttachCurrentThread(); |
| ScopedJavaLocalRef<jbyteArray> j_response = |
| base::android::ToJavaByteArray(env, response.data(), response.size()); |
| - ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( |
| - env, reinterpret_cast<const uint8_t*>(session_id.data()), |
| - session_id.size()); |
| + ScopedJavaLocalRef<jbyteArray> j_session_id = |
| + StringToJavaBytes(env, session_id); |
| uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
| Java_MediaDrmBridge_updateSession(env, j_media_drm_, j_session_id, j_response, |
| promise_id); |
| @@ -492,9 +504,8 @@ void MediaDrmBridge::CloseSession( |
| DVLOG(2) << __func__; |
| JNIEnv* env = AttachCurrentThread(); |
| - ScopedJavaLocalRef<jbyteArray> j_session_id = base::android::ToJavaByteArray( |
| - env, reinterpret_cast<const uint8_t*>(session_id.data()), |
| - session_id.size()); |
| + ScopedJavaLocalRef<jbyteArray> j_session_id = |
| + StringToJavaBytes(env, session_id); |
| uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
| Java_MediaDrmBridge_closeSession(env, j_media_drm_, j_session_id, promise_id); |
| } |
| @@ -505,9 +516,12 @@ void MediaDrmBridge::RemoveSession( |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| DVLOG(2) << __func__; |
| - NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android."; |
| - promise->reject(CdmPromise::NOT_SUPPORTED_ERROR, 0, |
| - "RemoveSession() is not supported."); |
| + JNIEnv* env = AttachCurrentThread(); |
| + ScopedJavaLocalRef<jbyteArray> j_session_id = |
| + StringToJavaBytes(env, session_id); |
| + uint32_t promise_id = cdm_promise_adapter_.SavePromise(std::move(promise)); |
| + Java_MediaDrmBridge_removeSession(env, j_media_drm_, j_session_id, |
| + promise_id); |
| } |
| CdmContext* MediaDrmBridge::GetCdmContext() { |
| @@ -698,7 +712,8 @@ void MediaDrmBridge::OnSessionKeysChange( |
| const JavaParamRef<jobject>& j_media_drm, |
| const JavaParamRef<jbyteArray>& j_session_id, |
| const JavaParamRef<jobjectArray>& j_keys_info, |
| - bool has_additional_usable_key) { |
| + bool has_additional_usable_key, |
| + bool is_key_release) { |
| DVLOG(2) << __func__; |
| CdmKeysInfo cdm_keys_info; |
| @@ -718,7 +733,7 @@ void MediaDrmBridge::OnSessionKeysChange( |
| jint j_status_code = Java_KeyStatus_getStatusCode(env, j_key_status); |
| CdmKeyInformation::KeyStatus key_status = |
| - ConvertKeyStatus(static_cast<KeyStatus>(j_status_code)); |
| + ConvertKeyStatus(static_cast<KeyStatus>(j_status_code), is_key_release); |
| DVLOG(2) << __func__ << "Key status change: " |
| << base::HexEncode(&key_id[0], key_id.size()) << ", " |
| @@ -916,8 +931,7 @@ void MediaDrmBridge::ProcessProvisionResponse(bool success, |
| JNIEnv* env = AttachCurrentThread(); |
| - ScopedJavaLocalRef<jbyteArray> j_response = base::android::ToJavaByteArray( |
| - env, reinterpret_cast<const uint8_t*>(response.data()), response.size()); |
| + ScopedJavaLocalRef<jbyteArray> j_response = StringToJavaBytes(env, response); |
| Java_MediaDrmBridge_processProvisionResponse(env, j_media_drm_, success, |
| j_response); |