Index: media/base/android/android_overlay_proxy.cc |
diff --git a/media/base/android/android_overlay_proxy.cc b/media/base/android/android_overlay_proxy.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1c8504f829a40fa8d27d37d2dda65217b5f0dca5 |
--- /dev/null |
+++ b/media/base/android/android_overlay_proxy.cc |
@@ -0,0 +1,66 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "media/base/android/android_overlay_proxy.h" |
+ |
+#include "base/android/jni_android.h" |
+#include "base/bind.h" |
+#include "jni/AndroidOverlayProxy_jni.h" |
+#include "media/base/android/android_overlay_callback.h" |
+ |
+using base::android::AttachCurrentThread; |
+using base::android::JavaRef; |
+using base::android::ScopedJavaLocalRef; |
+ |
+namespace media { |
+ |
+AndroidOverlayProxy::AndroidOverlayProxy( |
+ const JavaRef<jobject>& unwrapped_holder, |
+ std::unique_ptr<AndroidOverlayCallback> wrapped_callback) |
+ : wrapped_callback_(std::move(wrapped_callback)) { |
+ JNIEnv* env = AttachCurrentThread(); |
+ |
+ // Set the callback that we'll use to get the java surface. |
+ wrapped_callback_->SetAndroidSurfaceCB(base::Bind( |
+ &AndroidOverlayProxy::OnAndroidSurface, base::Unretained(this))); |
+ |
+ j_wrapped_surface_.Reset( |
+ env, Java_AndroidOverlayProxy_wrap(env, unwrapped_holder).obj()); |
+} |
+ |
+AndroidOverlayProxy::~AndroidOverlayProxy() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ wrapped_callback_->SetAndroidSurfaceCB( |
+ AndroidOverlayCallback::AndroidSurfaceCB()); |
+ |
+ JNIEnv* env = AttachCurrentThread(); |
+ if (j_wrapped_surface_.obj()) |
+ Java_AndroidOverlayProxy_release(env, j_wrapped_surface_.obj()); |
+} |
+ |
+void AndroidOverlayProxy::ScheduleLayout(const Config& config) { |
+ DCHECK(CalledOnValidThread()); |
+ JNIEnv* env = AttachCurrentThread(); |
+ Java_AndroidOverlayProxy_scheduleLayoutSurface( |
+ env, j_wrapped_surface_.obj(), config.rect.x(), config.rect.y(), |
+ config.rect.width(), config.rect.height()); |
+} |
+ |
+bool AndroidOverlayProxy::CalledOnValidThread() const { |
+ return thread_checker_.CalledOnValidThread(); |
+} |
+ |
+void AndroidOverlayProxy::OnAndroidSurface( |
+ const base::android::JavaRef<jobject>& jsurface) { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ android_surface_ = |
+ gl::ScopedJavaSurface::AcquireExternalSurface(jsurface.obj()); |
+} |
+ |
+gl::ScopedJavaSurface& AndroidOverlayProxy::GetAndroidSurface() { |
+ return android_surface_; |
+} |
+ |
+} // namespace media |