| 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..4ec2eedeb163167724952234c3f7bfdeec847457 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,13 @@ bool AreMediaDrmApisAvailable() {
|
| return true;
|
| }
|
|
|
| +bool IsPersistentLicenseTypeSupportedByMediaDrm() {
|
| + return MediaDrmBridge::IsAvailable() &&
|
| + // In development. See http://crbug.com/493521
|
| + base::FeatureList::IsEnabled(kMediaDrmPersistentLicense) &&
|
| + base::android::BuildInfo::GetInstance()->sdk_int() >= 23;
|
| +}
|
| +
|
| } // namespace
|
|
|
| // MediaDrm is not generally usable without MediaCodec. Thus, both the MediaDrm
|
| @@ -281,15 +290,9 @@ bool MediaDrmBridge::IsKeySystemSupported(const std::string& key_system) {
|
| // static
|
| bool MediaDrmBridge::IsPersistentLicenseTypeSupported(
|
| const std::string& key_system) {
|
| - if (!MediaDrmBridge::IsAvailable())
|
| - return false;
|
| -
|
| - if (!base::FeatureList::IsEnabled(kMediaDrmPersistentLicense)) {
|
| - return false;
|
| - }
|
| -
|
| - NOTIMPLEMENTED() << "In development. See http://crbug.com/493521";
|
| - return false;
|
| + // TODO(yucliu): Check |key_system| if persistent license is supported by
|
| + // MediaDrm.
|
| + return IsPersistentLicenseTypeSupportedByMediaDrm();
|
| }
|
|
|
| // static
|
| @@ -460,11 +463,20 @@ void MediaDrmBridge::LoadSession(
|
| DCHECK(task_runner_->BelongsToCurrentThread());
|
| DVLOG(2) << __func__;
|
|
|
| - DCHECK(base::FeatureList::IsEnabled(kMediaDrmPersistentLicense));
|
| + DCHECK(IsPersistentLicenseTypeSupportedByMediaDrm());
|
|
|
| - NOTIMPLEMENTED() << "EME persistent sessions not yet supported on Android.";
|
| - promise->reject(CdmPromise::NOT_SUPPORTED_ERROR, 0,
|
| - "LoadSession() is not supported.");
|
| + if (session_type != CdmSessionType::PERSISTENT_LICENSE_SESSION) {
|
| + promise->reject(
|
| + CdmPromise::NOT_SUPPORTED_ERROR, 0,
|
| + "LoadSession() is only supported for 'persistent-license'.");
|
| + return;
|
| + }
|
| +
|
| + 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 +489,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 +503,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 +515,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 +711,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 +732,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 +930,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);
|
|
|