// Copyright 2013 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. #ifndef UI_GL_ANDROID_SURFACE_TEXTURE_H_ #define UI_GL_ANDROID_SURFACE_TEXTURE_H_ #include <jni.h> #include "base/android/scoped_java_ref.h" #include "base/callback.h" #include "base/memory/ref_counted.h" #include "ui/gl/gl_export.h" struct ANativeWindow; namespace gfx { // This class serves as a bridge for native code to call java functions inside // android SurfaceTexture class. class GL_EXPORT SurfaceTexture : public base::RefCountedThreadSafe<SurfaceTexture>{ public: static scoped_refptr<SurfaceTexture> Create(int texture_id); static scoped_refptr<SurfaceTexture> CreateSingleBuffered(int texture_id); // Set the listener callback, which will be invoked on the same thread that // is being called from here for registration. // Note: Since callbacks come in from Java objects that might outlive objects // being referenced from the callback, the only robust way here is to create // the callback from a weak pointer to your object. void SetFrameAvailableCallback(const base::Closure& callback); // Update the texture image to the most recent frame from the image stream. void UpdateTexImage(); // Release the texture content. This is needed only in single buffered mode // to allow the image content producer to take ownership // of the image buffer. // This is *only* supported on SurfaceTexture instantiated via // |CreateSingleBuffered(...)|. void ReleaseTexImage(); // Retrieve the 4x4 texture coordinate transform matrix associated with the // texture image set by the most recent call to updateTexImage. void GetTransformMatrix(float mtx[16]); // Set the default size of the image buffers. void SetDefaultBufferSize(int width, int height); // Attach the SurfaceTexture to the texture currently bound to // GL_TEXTURE_EXTERNAL_OES. void AttachToGLContext(); // Detaches the SurfaceTexture from the context that owns its current GL // texture. Must be called with that context current on the calling thread. void DetachFromGLContext(); // Creates a native render surface for this surface texture. // The caller must release the underlying reference when done with the handle // by calling ANativeWindow_release(). ANativeWindow* CreateSurface(); const base::android::JavaRef<jobject>& j_surface_texture() const { return j_surface_texture_; } // This should only be used to guard the SurfaceTexture instantiated via // |CreateSingleBuffered(...)| static bool IsSingleBufferModeSupported(); static bool RegisterSurfaceTexture(JNIEnv* env); protected: explicit SurfaceTexture( const base::android::ScopedJavaLocalRef<jobject>& j_surface_texture); private: friend class base::RefCountedThreadSafe<SurfaceTexture>; ~SurfaceTexture(); // Java SurfaceTexture instance. base::android::ScopedJavaGlobalRef<jobject> j_surface_texture_; DISALLOW_COPY_AND_ASSIGN(SurfaceTexture); }; } // namespace gfx #endif // UI_GL_ANDROID_SURFACE_TEXTURE_H_