mediacodec
Hello, I'm using android's MediaCodec to render a movie to a texture
created in Unity. I do this by attaching the texture from Unity to a
framebuffer object and then rendering to it using the texture drawn to
by android SurfaceTexture. The movie was rendering fine until I switched
to Development build and then switched back to Production. Now, the
image from SurfaceTexture only shows up when I use Development build.
What changes in terms of OpenGL when I switch to development build? Or am I messing up the gl context somehow?
Below is the native code I call every frame where I think has the highest probability of having errors.
What changes in terms of OpenGL when I switch to development build? Or am I messing up the gl context somehow?
Below is the native code I call every frame where I think has the highest probability of having errors.
- public void DrawFrame() {
-
- synchronized(this) {
- if (updateSurface) {
- //GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
- mSurfaceTexture.updateTexImage();
-
- mSurfaceTexture.getTransformMatrix(mSTMatrix);
- updateSurface = false;
-
- Log.d(TAG, "Update texture");
-
- } else {
- return; //no need to render texture
- }
- }
- //mDecoderAct.onDrawFrame();
-
- //bind fbo
- GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, mFBO);
-
- //GLES20.glEnable(GLES20.GL_BLEND);
- //GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
- GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
- GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
-
- GLES20.glUseProgram(mProgram);
- checkGlError("glUseProgram");
-
- //texture
- GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
- GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTexExtOES); //no need to bind, updateTexImage does that. do it anyway
- GLES20.glUniform1i(mExtSamplerHandle, 0); //make sure the sampler is bound to the right texture unit
- //GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
-
- //position
- mVertices.position(VERTICES_DATA_POS_OFFSET);
- GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
- VERTICES_DATA_STRIDE_BYTES, mVertices);
- checkGlError("glVertexAttribPointer maPosition");
- GLES20.glEnableVertexAttribArray(maPositionHandle);
- checkGlError("glEnableVertexAttribArray maPositionHandle");
-
- //uv
- mVertices.position(VERTICES_DATA_UV_OFFSET); //point to first uv
- GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false,
- VERTICES_DATA_STRIDE_BYTES, mVertices);
- checkGlError("glVertexAttribPointer maTextureHandle");
- GLES20.glEnableVertexAttribArray(maTextureHandle);
- checkGlError("glEnableVertexAttribArray maTextureHandle");
-
- //Combine the projection and camera view matrices
- Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, mMMatrix, 0);
- Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
-
- //Apply the combined projection and camera view transformations
- GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
- GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);
-
- GLES20.glViewport(0, 0, mWidth, mHeight);
-
- GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
- checkGlError("glDrawArrays");
-
- //default
- GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
- GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
-
- }
Some notes: mFBO is the framebuffer I render the external texture
from SurfaceTexture (mTexExtOES). I've attached the texture from Unity
to it and changing the clear color reflects in unity so I know the
texture is being rendered to.