From a29e09b24350686e6a0eb4a344078009f7d6c842 Mon Sep 17 00:00:00 2001 From: Giacomo Randazzo Date: Fri, 22 Mar 2019 08:33:35 +0100 Subject: [PATCH] Refactor SnapshotVideoRecorder --- .../cameraview/TextureMediaEncoder.java | 2 +- .../com/otaliastudios/cameraview/Camera1.java | 2 +- .../cameraview/CameraController.java | 11 +++++ .../otaliastudios/cameraview/CameraView.java | 1 + .../cameraview/SnapshotVideoRecorder.java | 41 +++++++++++++++---- 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/cameraview/src/main/gles/com/otaliastudios/cameraview/TextureMediaEncoder.java b/cameraview/src/main/gles/com/otaliastudios/cameraview/TextureMediaEncoder.java index e2063dc2..987f38d0 100644 --- a/cameraview/src/main/gles/com/otaliastudios/cameraview/TextureMediaEncoder.java +++ b/cameraview/src/main/gles/com/otaliastudios/cameraview/TextureMediaEncoder.java @@ -88,7 +88,6 @@ class TextureMediaEncoder extends VideoMediaEncoder mWindow = new EglWindowSurface(mEglCore, mSurface, true); mWindow.makeCurrent(); // drawing will happen on the InputWindowSurface, which // is backed by mVideoEncoder.getInputSurface() -// mViewport = new EglViewport(mConfig.overlayTextureId != 0); mViewport = new EglViewport(); } @@ -144,6 +143,7 @@ class TextureMediaEncoder extends VideoMediaEncoder // but flipped based on the mConfig.scaleFlipped boolean. // mViewport.drawFrame(mConfig.textureId, mConfig.overlayTextureId, transform, overlayTransform); mViewport.drawFrame(mConfig.textureId, transform); + mViewport.drawFrame(mConfig.overlayTextureId, overlayTransform); mWindow.setPresentationTime(frame.timestamp); mWindow.swapBuffers(); mFramePool.recycle(frame); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java index 56d87204..0d7cafb9 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java @@ -790,7 +790,7 @@ class Camera1 extends CameraController implements Camera.PreviewCallback, Camera // Reset facing and start. mFacing = realFacing; GlCameraPreview cameraPreview = (GlCameraPreview) mPreview; - mVideoRecorder = new SnapshotVideoRecorder(videoResult, Camera1.this, cameraPreview, mDisableOverlayFor != DisableOverlayFor.VIDEO); + mVideoRecorder = new SnapshotVideoRecorder(videoResult, Camera1.this, cameraPreview, mDisableOverlayFor != DisableOverlayFor.VIDEO, videoSurfaceDrawerList); mVideoRecorder.start(); } }); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java index 61ec211b..ec068edf 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java @@ -39,6 +39,7 @@ abstract class CameraController implements /* for tests */ Handler mCrashHandler; protected final ArrayList pictureSurfaceDrawerList = new ArrayList<>(); + protected final ArrayList videoSurfaceDrawerList = new ArrayList<>(); protected Facing mFacing; protected Flash mFlash; @@ -680,4 +681,14 @@ abstract class CameraController implements public void removePictureSurfaceDrawer(@NonNull SurfaceDrawer surfaceDrawer) { pictureSurfaceDrawerList.remove(surfaceDrawer); } + + public void addVideoSurfaceDrawer(@NonNull SurfaceDrawer surfaceDrawer) { + if (!videoSurfaceDrawerList.contains(surfaceDrawer)) { + videoSurfaceDrawerList.add(surfaceDrawer); + } + } + + public void removeVideoSurfaceDrawer(@NonNull SurfaceDrawer surfaceDrawer) { + videoSurfaceDrawerList.remove(surfaceDrawer); + } } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 21e05aa1..ef19d7fb 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -308,6 +308,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { } mCameraController.addPictureSurfaceDrawer(mPreviewOverlayLayout); + mCameraController.addVideoSurfaceDrawer(mPreviewOverlayLayout); } if (!isInEditMode()) { mOrientationHelper.enable(getContext()); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java index 0051fd1d..8316ddba 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java @@ -3,6 +3,10 @@ package com.otaliastudios.cameraview; import android.graphics.SurfaceTexture; import android.opengl.EGL14; import android.os.Build; +import android.util.Log; +import android.view.Surface; + +import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -32,14 +36,18 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren private int mDesiredState = STATE_NOT_RECORDING; private int mTextureId = 0; private int mOverlayTextureId = 0; + private SurfaceTexture mOverlaySurfaceTexture; + private Surface mOverlaySurface; + private List mSurfaceDrawerList; private boolean mWithOverlay; - SnapshotVideoRecorder(@NonNull VideoResult stub, @Nullable VideoResultListener listener, @NonNull GlCameraPreview preview, boolean withOverlay) { + SnapshotVideoRecorder(@NonNull VideoResult stub, @Nullable VideoResultListener listener, @NonNull GlCameraPreview preview, boolean withOverlay, @NonNull List surfaceDrawerList) { super(stub, listener); mPreview = preview; mPreview.addRendererFrameCallback(this); mWithOverlay = withOverlay; + mSurfaceDrawerList = surfaceDrawerList; } @Override @@ -56,9 +64,14 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren @Override public void onRendererTextureCreated(int textureId) { mTextureId = textureId; -// if (textureId.length > 1) { -// mOverlayTextureId = textureId[1]; -// } + if (mWithOverlay) { + EglViewport temp = new EglViewport(); + mOverlayTextureId = temp.createTexture(); + + mOverlaySurfaceTexture = new SurfaceTexture(mOverlayTextureId); + mOverlaySurfaceTexture.setDefaultBufferSize(mResult.size.getWidth(), mResult.size.getHeight()); + mOverlaySurface = new Surface(mOverlaySurfaceTexture); + } } @RendererThread @@ -114,9 +127,15 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren TextureMediaEncoder.TextureFrame textureFrame = textureEncoder.acquireFrame(); textureFrame.timestamp = surfaceTexture.getTimestamp(); surfaceTexture.getTransformMatrix(textureFrame.transform); -// if (mWithOverlay && overlaySurfaceTexture != null) { -// overlaySurfaceTexture.getTransformMatrix(textureFrame.overlayTransform); -// } + + // get overlay + if (mOverlaySurfaceTexture != null) { + for (SurfaceDrawer surfaceDrawer : mSurfaceDrawerList) { + surfaceDrawer.drawOnSurface(mOverlaySurface); + } + mOverlaySurfaceTexture.updateTexImage(); + mOverlaySurfaceTexture.getTransformMatrix(textureFrame.overlayTransform); + } mEncoderEngine.notify(TextureMediaEncoder.FRAME_EVENT, textureFrame); } @@ -126,6 +145,14 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren mEncoderEngine = null; mPreview.removeRendererFrameCallback(SnapshotVideoRecorder.this); mPreview = null; + if (mOverlaySurfaceTexture != null) { + mOverlaySurfaceTexture.release(); + mOverlaySurfaceTexture = null; + } + if (mOverlaySurface != null) { + mOverlaySurface.release(); + mOverlaySurface = null; + } } }