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

Unified Diff: media/base/android/media_drm_bridge.cc

Issue 2796843002: [Clank] Load/Remove persistent license (Closed)
Patch Set: nit Created 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/base/android/media_drm_bridge.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « media/base/android/media_drm_bridge.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698