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

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

Issue 2805803002: [Clank] Implement MediaDrmStorageBridge with MediaDrmStorage (Closed)
Patch Set: 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
Index: media/base/android/media_drm_storage_bridge.cc
diff --git a/media/base/android/media_drm_storage_bridge.cc b/media/base/android/media_drm_storage_bridge.cc
index a9b6047c2c8a980e1346f7ae1f5925c88f979edb..4bc645a9e82437feb05644b496820c08d2c8a9c5 100644
--- a/media/base/android/media_drm_storage_bridge.cc
+++ b/media/base/android/media_drm_storage_bridge.cc
@@ -7,36 +7,73 @@
#include <memory>
#include "base/android/callback_android.h"
+#include "base/android/jni_array.h"
+#include "base/android/jni_string.h"
+#include "base/bind.h"
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "jni/MediaDrmStorageBridge_jni.h"
+#include "media/base/android/android_util.h"
+using base::android::AttachCurrentThread;
+using base::android::ConvertUTF8ToJavaString;
+using base::android::JavaByteArrayToByteVector;
using base::android::JavaParamRef;
using base::android::RunCallbackAndroid;
using base::android::ScopedJavaLocalRef;
+using base::android::ToJavaByteArray;
namespace media {
+namespace {
+void RunAndroidBoolCallback(JavaObjectPtr j_callback, bool success) {
+ RunCallbackAndroid(*j_callback, success);
+}
+
+void OnSessionDataLoaded(
+ JavaObjectPtr j_callback,
+ const std::string& session_id,
+ std::unique_ptr<MediaDrmStorage::SessionData> session_data) {
+ if (!session_data) {
+ RunCallbackAndroid(*j_callback, ScopedJavaLocalRef<jobject>());
+ return;
+ }
+
+ JNIEnv* env = AttachCurrentThread();
+ ScopedJavaLocalRef<jbyteArray> j_eme_id = StringToJavaBytes(env, session_id);
+ ScopedJavaLocalRef<jbyteArray> j_key_set_id = ToJavaByteArray(
+ env, session_data->key_set_id.data(), session_data->key_set_id.size());
+ ScopedJavaLocalRef<jstring> j_mime =
+ ConvertUTF8ToJavaString(env, session_data->mime_type);
+
+ RunCallbackAndroid(*j_callback, Java_PersistentInfo_create(
+ env, j_eme_id, j_key_set_id, j_mime));
+}
+} // namespace
// static
bool MediaDrmStorageBridge::RegisterMediaDrmStorageBridge(JNIEnv* env) {
return RegisterNativesImpl(env);
}
-MediaDrmStorageBridge::MediaDrmStorageBridge()
- : task_runner_(base::ThreadTaskRunnerHandle::Get()), weak_factory_(this) {}
+MediaDrmStorageBridge::MediaDrmStorageBridge(
+ const url::Origin& origin,
+ OnceCreateStorageCB create_storage_cb)
+ : create_storage_cb_(std::move(create_storage_cb)),
+ origin_(origin),
+ task_runner_(base::ThreadTaskRunnerHandle::Get()),
+ weak_factory_(this) {}
MediaDrmStorageBridge::~MediaDrmStorageBridge() = default;
-// TODO(yucliu): Implement these methods with MediaDrmStorage
-
void MediaDrmStorageBridge::OnProvisioned(
JNIEnv* env,
const JavaParamRef<jobject>& j_storage,
// Callback<Boolean>
const JavaParamRef<jobject>& j_callback) {
- NOTIMPLEMENTED();
-
- RunCallbackAndroid(j_callback, true);
+ PostCancellableTask(base::BindOnce(
+ &MediaDrmStorage::OnProvisioned, base::Unretained(GetStorageImpl()),
+ base::BindOnce(&RunAndroidBoolCallback,
+ base::Passed(CreateJavaObjectPtr(j_callback.obj())))));
}
void MediaDrmStorageBridge::OnLoadInfo(
@@ -45,9 +82,13 @@ void MediaDrmStorageBridge::OnLoadInfo(
const JavaParamRef<jbyteArray>& j_session_id,
// Callback<PersistentInfo>
const JavaParamRef<jobject>& j_callback) {
- NOTIMPLEMENTED();
-
- RunCallbackAndroid(j_callback, ScopedJavaLocalRef<jobject>());
+ std::string session_id = JavaBytesToString(env, j_session_id);
+ PostCancellableTask(base::BindOnce(
+ &MediaDrmStorage::LoadPersistentSession,
+ base::Unretained(GetStorageImpl()), session_id,
+ base::BindOnce(&OnSessionDataLoaded,
xhwang 2017/04/07 05:47:35 Is it safe to call OnSessionDataLoaded() and RunAn
yucliu1 2017/04/07 18:53:10 Changed to WeakPtr<MediaDrmStorage>.
xhwang 2017/04/07 19:12:52 Right. But OnSessionDataLoaded() isn't bounded usi
yucliu1 2017/04/07 19:30:19 I think it's safe to do this. If MediaDrmStorage i
xhwang 2017/04/07 21:34:43 The problem is that OnSessionDataLoaded() is not b
+ base::Passed(CreateJavaObjectPtr(j_callback.obj())),
+ session_id)));
}
void MediaDrmStorageBridge::OnSaveInfo(
@@ -56,9 +97,23 @@ void MediaDrmStorageBridge::OnSaveInfo(
const JavaParamRef<jobject>& j_persist_info,
// Callback<Boolean>
const JavaParamRef<jobject>& j_callback) {
- NOTIMPLEMENTED();
-
- RunCallbackAndroid(j_callback, false);
+ std::vector<uint8_t> key_set_id;
+ JavaByteArrayToByteVector(
+ env, Java_PersistentInfo_keySetId(env, j_persist_info.obj()).obj(),
+ &key_set_id);
+
+ std::string mime = ConvertJavaStringToUTF8(
+ env, Java_PersistentInfo_mimeType(env, j_persist_info.obj()));
+
+ std::string session_id = JavaBytesToString(
+ env, Java_PersistentInfo_emeId(env, j_persist_info.obj()).obj());
+
+ PostCancellableTask(base::BindOnce(
+ &MediaDrmStorage::SavePersistentSession,
+ base::Unretained(GetStorageImpl()), session_id,
+ MediaDrmStorage::SessionData(std::move(key_set_id), std::move(mime)),
+ base::BindOnce(&RunAndroidBoolCallback,
+ base::Passed(CreateJavaObjectPtr(j_callback.obj())))));
}
void MediaDrmStorageBridge::OnClearInfo(
@@ -67,8 +122,30 @@ void MediaDrmStorageBridge::OnClearInfo(
const JavaParamRef<jbyteArray>& j_session_id,
// Callback<Boolean>
const JavaParamRef<jobject>& j_callback) {
- NOTIMPLEMENTED();
+ PostCancellableTask(base::BindOnce(
+ &MediaDrmStorage::RemovePersistentSession,
+ base::Unretained(GetStorageImpl()), JavaBytesToString(env, j_session_id),
+ base::BindOnce(&RunAndroidBoolCallback,
+ base::Passed(CreateJavaObjectPtr(j_callback.obj())))));
+}
+
+MediaDrmStorage* MediaDrmStorageBridge::GetStorageImpl() {
+ if (!impl_) {
+ DCHECK(!create_storage_cb_.is_null());
xhwang 2017/04/07 05:47:35 nit: DCHECK(create_storage_cb);
yucliu1 2017/04/07 18:53:10 Done.
+ impl_ = std::move(create_storage_cb_).Run();
+ impl_->Initialize(origin_);
+ }
+
+ return impl_.get();
+}
+
+void MediaDrmStorageBridge::PostCancellableTask(base::OnceClosure task) {
+ task_runner_->PostTask(
+ FROM_HERE, base::Bind(&MediaDrmStorageBridge::RunCancellableTask,
+ weak_factory_.GetWeakPtr(), base::Passed(&task)));
+}
- RunCallbackAndroid(j_callback, false);
+void MediaDrmStorageBridge::RunCancellableTask(base::OnceClosure task) {
+ std::move(task).Run();
xhwang 2017/04/07 05:47:35 What's the purpose of PostCancellableTask and Run
yucliu1 2017/04/07 18:53:09 Add SupportsWeakPtr to MediaDrmStorage, it's redun
}
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698