OpenGL requires an RGBA image format. Does the transformation from YUV to RGBA is done by the SurfaceTexture?
On Dec 22 2011, 2:04 pm, Brad Grimm <[email protected]> wrote: > Brilliant! I must have been thinking too hard about it, because what > you wrote really is simple. I was able to get it working and it works > like a charm. > > Thank you! > > On Dec 22, 10:16 am, Romain Guy <[email protected]> wrote: > > > > > > > > > It is definitely an option, that's whatSurfaceTextureis for. It's very > > simple: > > > Create an OpenGL context > > Generate an OpenGL texture name > > Create aSurfaceTexturewith the texture name > > Pass theSurfaceTextureto Camera > > Listen for updates > > OnSurfaceTextureupdate, draw the texture with OpenGL using the shader you > > want > > > Simple :) > > > On Thu, Dec 22, 2011 at 11:59 AM, Brad Grimm <[email protected]> wrote: > > > Thanks Romain. I really just want to swap out the pixel shader on the > > >SurfaceTexture'sOpenGL texture so I can do some filtering on the > > > camera preview. But it sounds like that isn't an option. I have > > > used ColorMatrixFilters on the view itself and they work quite well, > > > just not powerful enough for what I want to do. > > > > On Dec 21, 8:18 pm, Romain Guy <[email protected]> wrote: > > >> There's no need to get the camera preview out ofSurfaceTexture. The whole > > >> point ofSurfaceTextureis to let a producer like the camera render into an > > >> OpenGL texture. Just useSurfaceTexture. > > > >> To draw on top of TextureView, just add another view on top of it. > > >> On Dec 21, 2011 9:35 PM, "Brad Grimm" <[email protected]> wrote: > > > >> > Thanks for the post, it has been really helpful. > > > >> > But say I want to draw on top of aSurfaceTexturethat is connected to > > >> > a Camera via setPreviewTexture. I can get theSurfaceTextureby a > > >> > SurfaceTextureListener. But if I just try to use > > >> > eglCreateWindowSurface & eglMakeCurrent it fails due to the surface > > >> > already being connected. > > >> > 1) Is it possible to draw on this surface at all? Or does binding it > > >> > to the camera make it impossible to do that. > > >> > 2) If it isn't possible. Can the surface be used (or copied) quickly > > >> > to an OpenGL texture and used in a separate surface? If so how? > > >> > 3) If not, what would be the fastest way to get the camera preview out > > >> > of aSurfaceTextureand into OpenGL? > > >> > P.S. - I too followed suit and posted to StackOverflow: > > > >> >http://stackoverflow.com/questions/8582090/possible-to-draw-on-surfac... > > >> > On Nov 23, 11:45 am, plafayette <[email protected]> wrote: > > >> > > Thanks for the quick response Romain and the sample code! Will give > > >> > > it > > >> > > a try. > > > >> > > On Nov 23, 12:17 pm, Romain Guy <[email protected]> wrote: > > > >> > > > GLSurfaceView handles GL setup for you, whichTextureViewwill not > > >> > > > do. A > > >> > > >TextureViewcan be used as the native window when you create an EGL > > >> > > > surface. Here is an example (the interesting part is the call > > >> > > > to eglCreateWindowSurface()): > > > >> > > > @Override > > >> > > > public void onSurfaceTextureAvailable(SurfaceTexturesurface, > > >> > > > int > > >> > > > width, int height) { > > >> > > > mRenderThread = new RenderThread(getResources(), surface); > > >> > > > mRenderThread.start(); > > >> > > > } > > > >> > > > private static class RenderThread extends Thread { > > >> > > > private static final String LOG_TAG = "GLTextureView"; > > > >> > > > static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; > > >> > > > static final int EGL_OPENGL_ES2_BIT = 4; > > > >> > > > private volatile boolean mFinished; > > > >> > > > private final Resources mResources; > > >> > > > private finalSurfaceTexturemSurface; > > > >> > > > private EGL10 mEgl; > > >> > > > private EGLDisplay mEglDisplay; > > >> > > > private EGLConfig mEglConfig; > > >> > > > private EGLContext mEglContext; > > >> > > > private EGLSurface mEglSurface; > > >> > > > private GL mGL; > > > >> > > > RenderThread(Resources resources,SurfaceTexturesurface) { > > >> > > > mResources = resources; > > >> > > > mSurface = surface; > > >> > > > } > > > >> > > > private static final String sSimpleVS = > > >> > > > "attribute vec4 position;\n" + > > >> > > > "attribute vec2 texCoords;\n" + > > >> > > > "varying vec2 outTexCoords;\n" + > > >> > > > "\nvoid main(void) {\n" + > > >> > > > " outTexCoords = texCoords;\n" + > > >> > > > " gl_Position = position;\n" + > > >> > > > "}\n\n"; > > >> > > > private static final String sSimpleFS = > > >> > > > "precision mediump float;\n\n" + > > >> > > > "varying vec2 outTexCoords;\n" + > > >> > > > "uniform sampler2D texture;\n" + > > >> > > > "\nvoid main(void) {\n" + > > >> > > > " gl_FragColor = texture2D(texture, > > >> > outTexCoords);\n" + > > >> > > > "}\n\n"; > > > >> > > > private static final int FLOAT_SIZE_BYTES = 4; > > >> > > > private static final int > > >> > > > TRIANGLE_VERTICES_DATA_STRIDE_BYTES = > > >> > 5 * > > >> > > > FLOAT_SIZE_BYTES; > > >> > > > private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET > > >> > > > = 0; > > >> > > > private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET > > >> > > > = 3; > > >> > > > private final float[] mTriangleVerticesData = { > > >> > > > // X, Y, Z, U, V > > >> > > > -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, > > >> > > > 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, > > >> > > > -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, > > >> > > > 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, > > >> > > > }; > > > >> > > > @Override > > >> > > > public void run() { > > >> > > > initGL(); > > > >> > > > FloatBuffer triangleVertices = > > >> > > > ByteBuffer.allocateDirect(mTriangleVerticesData.length > > >> > > > * > > >> > > > FLOAT_SIZE_BYTES).order(ByteOrder.nativeOrder()).asFloatBuffer(); > > >> > > > > > >> > > > triangleVertices.put(mTriangleVerticesData).position(0); > > > >> > > > int texture = loadTexture(R.drawable.large_photo); > > >> > > > int program = buildProgram(sSimpleVS, sSimpleFS); > > > >> > > > int attribPosition = glGetAttribLocation(program, > > >> > "position"); > > >> > > > checkGlError(); > > > >> > > > int attribTexCoords = glGetAttribLocation(program, > > >> > "texCoords"); > > >> > > > checkGlError(); > > > >> > > > int uniformTexture = glGetUniformLocation(program, > > >> > "texture"); > > >> > > > checkGlError(); > > > >> > > > glBindTexture(GL_TEXTURE_2D, texture); > > >> > > > checkGlError(); > > > >> > > > glUseProgram(program); > > >> > > > checkGlError(); > > > >> > > > glEnableVertexAttribArray(attribPosition); > > >> > > > checkGlError(); > > > >> > > > glEnableVertexAttribArray(attribTexCoords); > > >> > > > checkGlError(); > > > >> > > > glUniform1i(uniformTexture, texture); > > >> > > > checkGlError(); > > > >> > > > while (!mFinished) { > > >> > > > checkCurrent(); > > > >> > > > glClearColor(0.0f, 0.0f, 0.0f, 0.0f); > > >> > > > checkGlError(); > > > >> > > > glClear(GL_COLOR_BUFFER_BIT); > > >> > > > checkGlError(); > > > >> > > > // drawQuad > > > >> > > > triangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); > > >> > > > glVertexAttribPointer(attribPosition, 3, GL_FLOAT, > > >> > false, > > >> > > > TRIANGLE_VERTICES_DATA_STRIDE_BYTES, > > >> > > > triangleVertices); > > > >> > triangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); > > >> > > > glVertexAttribPointer(attribTexCoords, 3, GL_FLOAT, > > >> > false, > > >> > > > TRIANGLE_VERTICES_DATA_STRIDE_BYTES, > > >> > > > triangleVertices); > > > >> > > > glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); > > > >> > > > if (!mEgl.eglSwapBuffers(mEglDisplay, > > >> > > > mEglSurface)) { > > >> > > > throw new RuntimeException("Cannot swap > > >> > > > buffers"); > > >> > > > } > > >> > > > checkEglError(); > > > >> > > > try { > > >> > > > Thread.sleep(2000); > > >> > > > } catch (InterruptedException e) { > > >> > > > // Ignore > > >> > > > } > > >> > > > } > > > >> > > > finishGL(); > > >> > > > } > > > >> > > > private int loadTexture(int resource) { > > >> > > > int[] textures = new int[1]; > > > >> > > > glActiveTexture(GL_TEXTURE0); > > >> > > > glGenTextures(1, textures, 0); > > >> > > > checkGlError(); > > > >> > > > int texture = textures[0]; > > >> > > > glBindTexture(GL_TEXTURE_2D, texture); > > >> > > > checkGlError(); > > > >> > > > glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, > > >> > > > GL_LINEAR); > > ... > > read more » -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

