Java Code Examples for android.graphics.SurfaceTexture#getTransformMatrix()
The following examples show how to use
android.graphics.SurfaceTexture#getTransformMatrix() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: TextureRenderer.java From AndroidVideoSamples with Apache License 2.0 | 6 votes |
public void drawFrame( SurfaceTexture st ) { checkGlError( "onDrawFrame start" ); st.getTransformMatrix( mSTMatrix ); 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" ); GLES20.glActiveTexture( GLES20.GL_TEXTURE0 ); GLES20.glBindTexture( GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID ); mTriangleVertices.position( TRIANGLE_VERTICES_DATA_POS_OFFSET ); GLES20.glVertexAttribPointer( maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices ); checkGlError( "glVertexAttribPointer maPosition" ); GLES20.glEnableVertexAttribArray( maPositionHandle ); checkGlError( "glEnableVertexAttribArray maPositionHandle" ); mTriangleVertices.position( TRIANGLE_VERTICES_DATA_UV_OFFSET ); GLES20.glVertexAttribPointer( maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices ); checkGlError( "glVertexAttribPointer maTextureHandle" ); GLES20.glEnableVertexAttribArray( maTextureHandle ); checkGlError( "glEnableVertexAttribArray maTextureHandle" ); Matrix.setIdentityM( mMVPMatrix, 0 ); GLES20.glUniformMatrix4fv( muMVPMatrixHandle, 1, false, mMVPMatrix, 0 ); GLES20.glUniformMatrix4fv( muSTMatrixHandle, 1, false, mSTMatrix, 0 ); GLES20.glDrawArrays( GLES20.GL_TRIANGLE_STRIP, 0, 4 ); checkGlError( "glDrawArrays" ); GLES20.glFinish(); }
Example 2
Source File: TextureMovieEncoder.java From cineio-broadcast-android with MIT License | 6 votes |
/** * Tells the video recorder that a new frame is available. (Call from non-encoder thread.) * <p/> * This function sends a message and returns immediately. This isn't sufficient -- we * don't want the caller to latch a new frame until we're done with this one -- but we * can get away with it so long as the input frame rate is reasonable and the encoder * thread doesn't stall. * <p/> * TODO: either block here until the texture has been rendered onto the encoder surface, * or have a separate "block if still busy" method that the caller can execute immediately * before it calls updateTexImage(). The latter is preferred because we don't want to * stall the caller while this thread does work. */ public void frameAvailable(SurfaceTexture st) { synchronized (mReadyFence) { if (!mReady) { return; } } float[] transform = new float[16]; // TODO - avoid alloc every frame st.getTransformMatrix(transform); long timestamp = st.getTimestamp(); if (timestamp == 0) { // Seeing this after device is toggled off/on with power button. The // first frame back has a zero timestamp. // // MPEG4Writer thinks this is cause to abort() in native code, so it's very // important that we just ignore the frame. Log.w(TAG, "HEY: got SurfaceTexture with timestamp of zero"); return; } mHandler.sendMessage(mHandler.obtainMessage(MSG_FRAME_AVAILABLE, (int) (timestamp >> 32), (int) timestamp, transform)); }
Example 3
Source File: TextureRender.java From LiveMultimedia with Apache License 2.0 | 5 votes |
public void drawFrame(SurfaceTexture st) { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); 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"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); Matrix.setIdentityM(mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); GLES20.glFinish(); }
Example 4
Source File: TextureRenderer.java From talk-android with MIT License | 5 votes |
public void drawFrame(SurfaceTexture st, boolean invert) { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); if (invert) { mSTMatrix[5] = -mSTMatrix[5]; mSTMatrix[13] = 1.0f - mSTMatrix[13]; } GLES20.glUseProgram(mProgram); checkGlError("glUseProgram"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); GLES20.glFinish(); }
Example 5
Source File: TextureMovieEncoder.java From LiveVideoBroadcaster with Apache License 2.0 | 5 votes |
/** * Tells the video recorder that a new frame is available. (Call from non-encoder thread.) * <p> * This function sends a message and returns immediately. This isn't sufficient -- we * don't want the caller to latch a new frame until we're done with this one -- but we * can get away with it so long as the input frame rate is reasonable and the encoder * thread doesn't stall. * <p> * TODO: either block here until the texture has been rendered onto the encoder surface, * or have a separate "block if still busy" method that the caller can execute immediately * before it calls updateTexImage(). The latter is preferred because we don't want to * stall the caller while this thread does work. */ public void frameAvailable(SurfaceTexture st) { synchronized (mReadyFence) { if (!mReady) { return; } } if (mHandler == null) { return; } float[] transform = new float[16]; // TODO - avoid alloc every frame st.getTransformMatrix(transform); /* long timestamp = st.getTimestamp(); if (timestamp == 0) { // Seeing this after device is toggled off/on with power button. The // first frame back has a zero timestamp. // // MPEG4Writer thinks this is cause to abort() in native code, so it's very // important that we just ignore the frame. Log.w(TAG, "HEY: got SurfaceTexture with timestamp of zero"); return; } */ long frameTime = System.currentTimeMillis(); if (mVideoEncoder != null && (frameTime - mLastFrameTime) >= getFrameInterval()) { Log.d(TAG, " get frame interval :" + getFrameInterval()); // encode data at least in every 50 milliseconds, it measn 20fps or less long timestamp = (frameTime - mRecordingStartTime) * 1000000; // convert it to nano seconds mLastFrameTime = frameTime; mHandler.sendMessage(mHandler.obtainMessage(MSG_FRAME_AVAILABLE, (int) (timestamp >> 32), (int) timestamp, transform)); } }
Example 6
Source File: TextureRender.java From phoenix with Apache License 2.0 | 5 votes |
public void drawFrame(SurfaceTexture st) { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); 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"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); Matrix.setIdentityM(mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); GLES20.glFinish(); }
Example 7
Source File: TextureRender.java From phoenix with Apache License 2.0 | 5 votes |
public void drawFrame(SurfaceTexture st) { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); 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"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); Matrix.setIdentityM(mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); GLES20.glFinish(); }
Example 8
Source File: TextureRender.java From mollyim-android with GNU General Public License v3.0 | 5 votes |
void drawFrame(SurfaceTexture st) throws TranscodingException { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); 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"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); Matrix.setIdentityM(mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); GLES20.glFinish(); }
Example 9
Source File: TextureRenderer.java From TelePlus-Android with GNU General Public License v2.0 | 5 votes |
public void drawFrame(SurfaceTexture st, boolean invert) { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); if (invert) { mSTMatrix[5] = -mSTMatrix[5]; mSTMatrix[13] = 1.0f - mSTMatrix[13]; } GLES20.glUseProgram(mProgram); checkGlError("glUseProgram"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); GLES20.glFinish(); }
Example 10
Source File: TextureMovieEncoder.java From TikTok with Apache License 2.0 | 5 votes |
/** * Tells the video recorder that a new frame is available. (Call from non-encoder thread.) * <p> * This function sends a message and returns immediately. This isn't sufficient -- we * don't want the caller to latch a new frame until we're done with this one -- but we * can get away with it so long as the input frame rate is reasonable and the encoder * thread doesn't stall. * <p> * TODO: either block here until the texture has been rendered onto the encoder surface, * or have a separate "block if still busy" method that the caller can execute immediately * before it calls updateTexImage(). The latter is preferred because we don't want to * stall the caller while this thread does work. */ public void frameAvailable(SurfaceTexture st) { synchronized (mReadyFence) { if (!mReady) { return; } } float[] transform = new float[16]; // TODO - avoid alloc every frame st.getTransformMatrix(transform); long timestamp = st.getTimestamp(); if (timestamp == 0) { // Seeing this after device is toggled off/on with power button. The // first frame back has a zero timestamp. // // MPEG4Writer thinks this is cause to abort() in native code, so it's very // important that we just ignore the frame. Log.w(TAG, "HEY: got SurfaceTexture with timestamp of zero"); return; } if(mHandler == null){ return ; } // DebugTool.warn(TAG + ",frameAvailable:" + (int) (timestamp >> 32) + "," + (int) timestamp + "," + transform); mHandler.sendMessage(mHandler.obtainMessage(MSG_FRAME_AVAILABLE, (int) (timestamp >> 32), (int) timestamp, transform)); }
Example 11
Source File: TextureRenderer.java From Telegram with GNU General Public License v2.0 | 4 votes |
public void drawFrame(SurfaceTexture st, boolean invert) { checkGlError("onDrawFrame start"); if (isPhoto) { GLES20.glUseProgram(simpleShaderProgram); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glUniform1i(simpleSourceImageHandle, 0); GLES20.glEnableVertexAttribArray(simpleInputTexCoordHandle); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); GLES20.glEnableVertexAttribArray(simplePositionHandle); } else { st.getTransformMatrix(mSTMatrix); if (blendEnabled) { GLES20.glDisable(GLES20.GL_BLEND); blendEnabled = false; } if (filterShaders != null) { filterShaders.onVideoFrameUpdate(mSTMatrix); GLES20.glViewport(0, 0, videoWidth, videoHeight); filterShaders.drawEnhancePass(); filterShaders.drawSharpenPass(); filterShaders.drawCustomParamsPass(); boolean blurred = filterShaders.drawBlurPass(); GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); GLES20.glUseProgram(simpleShaderProgram); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, filterShaders.getRenderTexture(blurred ? 0 : 1)); GLES20.glUniform1i(simpleSourceImageHandle, 0); GLES20.glEnableVertexAttribArray(simpleInputTexCoordHandle); GLES20.glVertexAttribPointer(simpleInputTexCoordHandle, 2, GLES20.GL_FLOAT, false, 8, filterShaders.getTextureBuffer()); GLES20.glEnableVertexAttribArray(simplePositionHandle); GLES20.glVertexAttribPointer(simplePositionHandle, 2, GLES20.GL_FLOAT, false, 8, filterShaders.getVertexBuffer()); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); } else { if (invert) { mSTMatrix[5] = -mSTMatrix[5]; mSTMatrix[13] = 1.0f - mSTMatrix[13]; } GLES20.glUseProgram(mProgram); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); GLES20.glVertexAttribPointer(maPositionHandle, 2, GLES20.GL_FLOAT, false, 8, verticesBuffer); GLES20.glEnableVertexAttribArray(maPositionHandle); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); GLES20.glEnableVertexAttribArray(maTextureHandle); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); if (paintTexture != null || stickerTexture != null) { GLES20.glUseProgram(simpleShaderProgram); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glUniform1i(simpleSourceImageHandle, 0); GLES20.glEnableVertexAttribArray(simpleInputTexCoordHandle); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, 8, textureBuffer); GLES20.glEnableVertexAttribArray(simplePositionHandle); } } } if (paintTexture != null) { for (int a = 0; a < paintTexture.length; a++) { drawTexture(true, paintTexture[a]); } } if (stickerTexture != null) { for (int a = 0, N = mediaEntities.size(); a < N; a++) { VideoEditedInfo.MediaEntity entity = mediaEntities.get(a); if (entity.ptr != 0) { RLottieDrawable.getFrame(entity.ptr, (int) entity.currentFrame, stickerBitmap, 512, 512, stickerBitmap.getRowBytes()); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, stickerTexture[0]); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, stickerBitmap, 0); entity.currentFrame += entity.framesPerDraw; if (entity.currentFrame >= entity.metadata[0]) { entity.currentFrame = 0; } drawTexture(false, stickerTexture[0], entity.x, entity.y, entity.width, entity.height, entity.rotation, (entity.subType & 2) != 0); } else if (entity.bitmap != null) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, stickerTexture[0]); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, entity.bitmap, 0); drawTexture(false, stickerTexture[0], entity.x, entity.y, entity.width, entity.height, entity.rotation, (entity.subType & 2) != 0); } } } GLES20.glFinish(); }
Example 12
Source File: SurfaceTexturePlatformWrapper.java From android-chromium with BSD 2-Clause "Simplified" License | 4 votes |
@CalledByNative private static void getTransformMatrix(SurfaceTexture surfaceTexture, float[] matrix) { surfaceTexture.getTransformMatrix(matrix); }
Example 13
Source File: TextureRect.java From GLEXP-Team-onebillion with Apache License 2.0 | 4 votes |
public void drawSurface(OBRenderer renderer, float l, float t, float r, float b, SurfaceTexture surfaceTexture,boolean mirrored) { fillOutRectVertexData(vertices,l,t,r,b,POSITION_COMPONENT_COUNT + UV_COMPONENT_COUNT); float m[] = new float[16]; surfaceTexture.getTransformMatrix(m); if (!isIdentity(m) && !mirrored) { float v[] = new float[4]; v[0] = uvLeft;v[1] = uvBottom;v[2] = 0;v[3] = 1; float o[] = new float[4]; android.opengl.Matrix.multiplyMV(o,0,m,0,v,0); v[0] = uvRight;v[1] = uvTop;v[2] = 0;v[3] = 1; uvLeft = o[0];uvTop = o[1]; android.opengl.Matrix.multiplyMV(o,0,m,0,v,0); uvRight = o[0]; uvBottom = o[1]; } fillOutRectTextureData(vertices,uvLeft,uvTop,uvRight,uvBottom,POSITION_COMPONENT_COUNT + UV_COMPONENT_COUNT); if (vertexArray == null) vertexArray = new VertexArray(vertices); else vertexArray.put(vertices); bindSurfaceData((SurfaceShaderProgram) renderer.surfaceProgram); try { surfaceTexture.updateTexImage(); }catch (Exception e) { e.printStackTrace(); } glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES,renderer.textureObjectId(2)); GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); GLES20.glEnable(GLES20.GL_BLEND); glDrawArrays(GL_TRIANGLE_STRIP,0,4); GLES20.glFinish(); }
Example 14
Source File: VideoSurfaceProcessor.java From AAVT with Apache License 2.0 | 4 votes |
private void glRun(){ EglHelper egl=new EglHelper(); boolean ret=egl.createGLESWithSurface(new EGLConfigAttrs(),new EGLContextAttrs(),new SurfaceTexture(1)); if(!ret){ //todo 错误处理 return; } int mInputSurfaceTextureId = GpuUtils.createTextureID(true); SurfaceTexture mInputSurfaceTexture = new SurfaceTexture(mInputSurfaceTextureId); Point size=mProvider.open(mInputSurfaceTexture); AvLog.d(TAG,"Provider Opened . data size (x,y)="+size.x+"/"+size.y); if(size.x<=0||size.y<=0){ //todo 错误处理 destroyGL(egl); synchronized (LOCK){ LOCK.notifyAll(); } return; } int mSourceWidth = size.x; int mSourceHeight = size.y; synchronized (LOCK){ LOCK.notifyAll(); } //要求数据源提供者必须同步返回数据大小 if(mSourceWidth <=0|| mSourceHeight <=0){ error(1,"video source return inaccurate size to SurfaceTextureActuator"); return; } if(mRenderer==null){ mRenderer=new WrapRenderer(null); } FrameBuffer sourceFrame=new FrameBuffer(); mRenderer.create(); mRenderer.sizeChanged(mSourceWidth, mSourceHeight); mRenderer.setFlag(mProvider.isLandscape()?WrapRenderer.TYPE_CAMERA:WrapRenderer.TYPE_MOVE); //用于其他的回调 RenderBean rb=new RenderBean(); rb.egl=egl; rb.sourceWidth= mSourceWidth; rb.sourceHeight= mSourceHeight; rb.endFlag=false; rb.threadId=Thread.currentThread().getId(); AvLog.d(TAG,"Processor While Loop Entry"); //要求数据源必须同步填充SurfaceTexture,填充完成前等待 while (!mProvider.frame()&&mGLThreadFlag){ mInputSurfaceTexture.updateTexImage(); mInputSurfaceTexture.getTransformMatrix(mRenderer.getTextureMatrix()); AvLog.d(TAG,"timestamp:"+ mInputSurfaceTexture.getTimestamp()); sourceFrame.bindFrameBuffer(mSourceWidth, mSourceHeight); GLES20.glViewport(0,0, mSourceWidth, mSourceHeight); mRenderer.draw(mInputSurfaceTextureId); sourceFrame.unBindFrameBuffer(); rb.textureId=sourceFrame.getCacheTextureId(); //接收数据源传入的时间戳 rb.timeStamp=mProvider.getTimeStamp(); rb.textureTime= mInputSurfaceTexture.getTimestamp(); observable.notify(rb); } AvLog.d(TAG,"out of gl thread loop"); synchronized (LOCK){ rb.endFlag=true; observable.notify(rb); mRenderer.destroy(); destroyGL(egl); LOCK.notifyAll(); AvLog.d(TAG,"gl thread exit"); } }
Example 15
Source File: SurfaceTexturePlatformWrapper.java From 365browser with Apache License 2.0 | 4 votes |
@CalledByNative private static void getTransformMatrix(SurfaceTexture surfaceTexture, float[] matrix) { surfaceTexture.getTransformMatrix(matrix); }
Example 16
Source File: SurfaceTextureRenderer.java From android_9.0.0_r45 with Apache License 2.0 | 4 votes |
private void drawFrame(SurfaceTexture st, int width, int height, int flipType) throws LegacyExceptionUtils.BufferQueueAbandonedException { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); Matrix.setIdentityM(mMVPMatrix, /*smOffset*/0); // Find intermediate buffer dimensions Size dimens; try { dimens = LegacyCameraDevice.getTextureSize(st); } catch (LegacyExceptionUtils.BufferQueueAbandonedException e) { // Should never hit this. throw new IllegalStateException("Surface abandoned, skipping drawFrame...", e); } float texWidth = dimens.getWidth(); float texHeight = dimens.getHeight(); if (texWidth <= 0 || texHeight <= 0) { throw new IllegalStateException("Illegal intermediate texture with dimension of 0"); } // Letterbox or pillar-box output dimensions into intermediate dimensions. RectF intermediate = new RectF(/*left*/0, /*top*/0, /*right*/texWidth, /*bottom*/texHeight); RectF output = new RectF(/*left*/0, /*top*/0, /*right*/width, /*bottom*/height); android.graphics.Matrix boxingXform = new android.graphics.Matrix(); boxingXform.setRectToRect(output, intermediate, android.graphics.Matrix.ScaleToFit.CENTER); boxingXform.mapRect(output); // Find scaling factor from pillar-boxed/letter-boxed output dimensions to intermediate // buffer dimensions. float scaleX = intermediate.width() / output.width(); float scaleY = intermediate.height() / output.height(); // Intermediate texture is implicitly scaled to 'fill' the output dimensions in clip space // coordinates in the shader. To avoid stretching, we need to scale the larger dimension // of the intermediate buffer so that the output buffer is actually letter-boxed // or pillar-boxed into the intermediate buffer after clipping. Matrix.scaleM(mMVPMatrix, /*offset*/0, /*x*/scaleX, /*y*/scaleY, /*z*/1); if (DEBUG) { Log.d(TAG, "Scaling factors (S_x = " + scaleX + ",S_y = " + scaleY + ") used for " + width + "x" + height + " surface, intermediate buffer size is " + texWidth + "x" + texHeight); } // Set viewport to be output buffer dimensions GLES20.glViewport(0, 0, width, height); if (DEBUG) { GLES20.glClearColor(1.0f, 0.0f, 0.0f, 1.0f); GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); } GLES20.glUseProgram(mProgram); checkGlError("glUseProgram"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); FloatBuffer triangleVertices; switch(flipType) { case FLIP_TYPE_HORIZONTAL: triangleVertices = mHorizontalFlipTriangleVertices; break; case FLIP_TYPE_VERTICAL: triangleVertices = mVerticalFlipTriangleVertices; break; case FLIP_TYPE_BOTH: triangleVertices = mBothFlipTriangleVertices; break; default: triangleVertices = mRegularTriangleVertices; break; } triangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, VERTEX_POS_SIZE, GLES20.GL_FLOAT, /*normalized*/ false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, triangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); triangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, VERTEX_UV_SIZE, GLES20.GL_FLOAT, /*normalized*/ false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, triangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, /*count*/ 1, /*transpose*/ false, mMVPMatrix, /*offset*/ 0); GLES20.glUniformMatrix4fv(muSTMatrixHandle, /*count*/ 1, /*transpose*/ false, mSTMatrix, /*offset*/ 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, /*offset*/ 0, /*count*/ 4); checkGlDrawError("glDrawArrays"); }
Example 17
Source File: CameraToMpegTest.java From Android-MediaCodec-Examples with Apache License 2.0 | 4 votes |
public void drawFrame(SurfaceTexture st) { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); // (optional) clear to green so we can see if we're failing to set pixels 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"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); Matrix.setIdentityM(mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); // IMPORTANT: on some devices, if you are sharing the external texture between two // contexts, one context may not see updates to the texture unless you un-bind and // re-bind it. If you're not using shared EGL contexts, you don't need to bind // texture 0 here. GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0); }
Example 18
Source File: CameraEncoder.java From kickflip-android-sdk with Apache License 2.0 | 4 votes |
/** * Called on Encoder thread * * @param surfaceTexture the SurfaceTexure that initiated the call to onFrameAvailable */ private void handleFrameAvailable(SurfaceTexture surfaceTexture) { if (TRACE) Trace.beginSection("handleFrameAvail"); synchronized (mReadyForFrameFence) { if (!mReadyForFrames) { if (VERBOSE) Log.i(TAG, "Ignoring available frame, not ready"); return; } mFrameNum++; if (VERBOSE && (mFrameNum % 30 == 0)) Log.i(TAG, "handleFrameAvailable"); if (!surfaceTexture.equals(mSurfaceTexture)) Log.w(TAG, "SurfaceTexture from OnFrameAvailable does not match saved SurfaceTexture!"); if (mRecording) { mInputWindowSurface.makeCurrent(); if (TRACE) Trace.beginSection("drainVEncoder"); mVideoEncoder.drainEncoder(false); if (TRACE) Trace.endSection(); if (mCurrentFilter != mNewFilter) { Filters.updateFilter(mFullScreen, mNewFilter); mCurrentFilter = mNewFilter; mIncomingSizeUpdated = true; } if (mIncomingSizeUpdated) { mFullScreen.getProgram().setTexSize(mSessionConfig.getVideoWidth(), mSessionConfig.getVideoHeight()); mIncomingSizeUpdated = false; } surfaceTexture.getTransformMatrix(mTransform); if (TRACE) Trace.beginSection("drawVEncoderFrame"); mFullScreen.drawFrame(mTextureId, mTransform); if (TRACE) Trace.endSection(); if (!mEncodedFirstFrame) { mEncodedFirstFrame = true; } if (mThumbnailRequestedOnFrame == mFrameNum) { mThumbnailRequested = true; } if (mThumbnailRequested) { saveFrameAsImage(); mThumbnailRequested = false; } mInputWindowSurface.setPresentationTime(mSurfaceTexture.getTimestamp()); mInputWindowSurface.swapBuffers(); if (mEosRequested) { /*if (VERBOSE) */ Log.i(TAG, "Sending last video frame. Draining encoder"); mVideoEncoder.signalEndOfStream(); mVideoEncoder.drainEncoder(true); mRecording = false; mEosRequested = false; releaseEncoder(); mState = STATE.UNINITIALIZED; synchronized (mStopFence) { mStopFence.notify(); } } } } // Signal GLSurfaceView to render mDisplayView.requestRender(); if (TRACE) Trace.endSection(); }
Example 19
Source File: SurfaceTexturePlatformWrapper.java From android-chromium with BSD 2-Clause "Simplified" License | 4 votes |
@CalledByNative private static void getTransformMatrix(SurfaceTexture surfaceTexture, float[] matrix) { surfaceTexture.getTransformMatrix(matrix); }
Example 20
Source File: ExtractMpegFramesTest.java From Android-MediaCodec-Examples with Apache License 2.0 | 4 votes |
/** * Draws the external texture in SurfaceTexture onto the current EGL surface. */ public void drawFrame(SurfaceTexture st, boolean invert) { checkGlError("onDrawFrame start"); st.getTransformMatrix(mSTMatrix); if (invert) { mSTMatrix[5] = -mSTMatrix[5]; mSTMatrix[13] = 1.0f - mSTMatrix[13]; } // (optional) clear to green so we can see if we're failing to set pixels GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f); GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glUseProgram(mProgram); checkGlError("glUseProgram"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); Matrix.setIdentityM(mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0); }