package com.asha.vrlib.texture; import android.graphics.SurfaceTexture; import android.opengl.GLES11Ext; import android.opengl.GLES20; import android.view.Surface; import com.asha.vrlib.MD360Program; import com.asha.vrlib.MDVRLibrary; import javax.microedition.khronos.opengles.GL10; import static com.asha.vrlib.common.GLUtil.glCheck; /** * Created by hzqiujiadi on 16/4/5. * hzqiujiadi ashqalcn@gmail.com */ public class MD360VideoTexture extends MD360Texture { private Surface mSurface; private SurfaceTexture mSurfaceTexture; private MDVRLibrary.IOnSurfaceReadyCallback mOnSurfaceReadyListener; private float[] mTransformMatrix = new float[16]; private static final int[] sUseTransform = new int[]{1}; public MD360VideoTexture(MDVRLibrary.IOnSurfaceReadyCallback onSurfaceReadyListener) { mOnSurfaceReadyListener = onSurfaceReadyListener; } @Override public void release() { mOnSurfaceReadyListener = null; } @Override public void create() { super.create(); int glSurfaceTexture = getCurrentTextureId(); if (isEmpty(glSurfaceTexture)) return; onCreateSurface(glSurfaceTexture); } @Override public boolean isReady() { return true; } @Override public void destroy() { if (mSurfaceTexture != null) { mSurfaceTexture.release(); } mSurfaceTexture = null; if (mSurface != null) { mSurface.release(); } mSurface = null; } private void onCreateSurface(int glSurfaceTextureId) { if ( mSurfaceTexture == null ) { //attach the texture to a surface. //It's a clue class for rendering an android view to gl level mSurfaceTexture = new SurfaceTexture(glSurfaceTextureId); // mSurfaceTexture.setDefaultBufferSize(getWidth(), getHeight()); mSurface = new Surface(mSurfaceTexture); if (mOnSurfaceReadyListener != null) mOnSurfaceReadyListener.onSurfaceReady(mSurface); } } @Override protected int createTextureId() { int[] textures = new int[1]; // Generate the texture to where android view will be rendered GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glGenTextures(1, textures, 0); glCheck("Texture generate"); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textures[0]); glCheck("Texture bind"); GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); GLES20.glTexParameterf(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); return textures[0]; } @Override public boolean texture(MD360Program program) { int glSurfaceTexture = getCurrentTextureId(); if (isEmpty(glSurfaceTexture)) return false; if (mSurfaceTexture == null) return false; mSurfaceTexture.updateTexImage(); // surface transform get mSurfaceTexture.getTransformMatrix(mTransformMatrix); GLES20.glUniform1iv(program.getUseTextureTransformHandle(), 1, sUseTransform, 0); GLES20.glUniformMatrix4fv(program.getSTMatrixHandle(), 1, false, mTransformMatrix, 0); return true; } @Override public void notifyChanged() { if (mSurface != null && mOnSurfaceReadyListener != null) { mOnSurfaceReadyListener.onSurfaceReady(mSurface); } } }