Refactor SnapshotVideoRecorder

pull/421/head
Giacomo Randazzo 7 years ago
parent a15be094c9
commit a29e09b243
  1. 2
      cameraview/src/main/gles/com/otaliastudios/cameraview/TextureMediaEncoder.java
  2. 2
      cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java
  3. 11
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java
  4. 1
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  5. 41
      cameraview/src/main/java/com/otaliastudios/cameraview/SnapshotVideoRecorder.java

@ -88,7 +88,6 @@ class TextureMediaEncoder extends VideoMediaEncoder<TextureMediaEncoder.Config>
mWindow = new EglWindowSurface(mEglCore, mSurface, true); mWindow = new EglWindowSurface(mEglCore, mSurface, true);
mWindow.makeCurrent(); // drawing will happen on the InputWindowSurface, which mWindow.makeCurrent(); // drawing will happen on the InputWindowSurface, which
// is backed by mVideoEncoder.getInputSurface() // is backed by mVideoEncoder.getInputSurface()
// mViewport = new EglViewport(mConfig.overlayTextureId != 0);
mViewport = new EglViewport(); mViewport = new EglViewport();
} }
@ -144,6 +143,7 @@ class TextureMediaEncoder extends VideoMediaEncoder<TextureMediaEncoder.Config>
// but flipped based on the mConfig.scaleFlipped boolean. // but flipped based on the mConfig.scaleFlipped boolean.
// mViewport.drawFrame(mConfig.textureId, mConfig.overlayTextureId, transform, overlayTransform); // mViewport.drawFrame(mConfig.textureId, mConfig.overlayTextureId, transform, overlayTransform);
mViewport.drawFrame(mConfig.textureId, transform); mViewport.drawFrame(mConfig.textureId, transform);
mViewport.drawFrame(mConfig.overlayTextureId, overlayTransform);
mWindow.setPresentationTime(frame.timestamp); mWindow.setPresentationTime(frame.timestamp);
mWindow.swapBuffers(); mWindow.swapBuffers();
mFramePool.recycle(frame); mFramePool.recycle(frame);

@ -790,7 +790,7 @@ class Camera1 extends CameraController implements Camera.PreviewCallback, Camera
// Reset facing and start. // Reset facing and start.
mFacing = realFacing; mFacing = realFacing;
GlCameraPreview cameraPreview = (GlCameraPreview) mPreview; 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(); mVideoRecorder.start();
} }
}); });

@ -39,6 +39,7 @@ abstract class CameraController implements
/* for tests */ Handler mCrashHandler; /* for tests */ Handler mCrashHandler;
protected final ArrayList<SurfaceDrawer> pictureSurfaceDrawerList = new ArrayList<>(); protected final ArrayList<SurfaceDrawer> pictureSurfaceDrawerList = new ArrayList<>();
protected final ArrayList<SurfaceDrawer> videoSurfaceDrawerList = new ArrayList<>();
protected Facing mFacing; protected Facing mFacing;
protected Flash mFlash; protected Flash mFlash;
@ -680,4 +681,14 @@ abstract class CameraController implements
public void removePictureSurfaceDrawer(@NonNull SurfaceDrawer surfaceDrawer) { public void removePictureSurfaceDrawer(@NonNull SurfaceDrawer surfaceDrawer) {
pictureSurfaceDrawerList.remove(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);
}
} }

@ -308,6 +308,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver {
} }
mCameraController.addPictureSurfaceDrawer(mPreviewOverlayLayout); mCameraController.addPictureSurfaceDrawer(mPreviewOverlayLayout);
mCameraController.addVideoSurfaceDrawer(mPreviewOverlayLayout);
} }
if (!isInEditMode()) { if (!isInEditMode()) {
mOrientationHelper.enable(getContext()); mOrientationHelper.enable(getContext());

@ -3,6 +3,10 @@ package com.otaliastudios.cameraview;
import android.graphics.SurfaceTexture; import android.graphics.SurfaceTexture;
import android.opengl.EGL14; import android.opengl.EGL14;
import android.os.Build; import android.os.Build;
import android.util.Log;
import android.view.Surface;
import java.util.List;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -32,14 +36,18 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren
private int mDesiredState = STATE_NOT_RECORDING; private int mDesiredState = STATE_NOT_RECORDING;
private int mTextureId = 0; private int mTextureId = 0;
private int mOverlayTextureId = 0; private int mOverlayTextureId = 0;
private SurfaceTexture mOverlaySurfaceTexture;
private Surface mOverlaySurface;
private List<SurfaceDrawer> mSurfaceDrawerList;
private boolean mWithOverlay; 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<SurfaceDrawer> surfaceDrawerList) {
super(stub, listener); super(stub, listener);
mPreview = preview; mPreview = preview;
mPreview.addRendererFrameCallback(this); mPreview.addRendererFrameCallback(this);
mWithOverlay = withOverlay; mWithOverlay = withOverlay;
mSurfaceDrawerList = surfaceDrawerList;
} }
@Override @Override
@ -56,9 +64,14 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren
@Override @Override
public void onRendererTextureCreated(int textureId) { public void onRendererTextureCreated(int textureId) {
mTextureId = textureId; mTextureId = textureId;
// if (textureId.length > 1) { if (mWithOverlay) {
// mOverlayTextureId = textureId[1]; EglViewport temp = new EglViewport();
// } mOverlayTextureId = temp.createTexture();
mOverlaySurfaceTexture = new SurfaceTexture(mOverlayTextureId);
mOverlaySurfaceTexture.setDefaultBufferSize(mResult.size.getWidth(), mResult.size.getHeight());
mOverlaySurface = new Surface(mOverlaySurfaceTexture);
}
} }
@RendererThread @RendererThread
@ -114,9 +127,15 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren
TextureMediaEncoder.TextureFrame textureFrame = textureEncoder.acquireFrame(); TextureMediaEncoder.TextureFrame textureFrame = textureEncoder.acquireFrame();
textureFrame.timestamp = surfaceTexture.getTimestamp(); textureFrame.timestamp = surfaceTexture.getTimestamp();
surfaceTexture.getTransformMatrix(textureFrame.transform); 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); mEncoderEngine.notify(TextureMediaEncoder.FRAME_EVENT, textureFrame);
} }
@ -126,6 +145,14 @@ class SnapshotVideoRecorder extends VideoRecorder implements GlCameraPreview.Ren
mEncoderEngine = null; mEncoderEngine = null;
mPreview.removeRendererFrameCallback(SnapshotVideoRecorder.this); mPreview.removeRendererFrameCallback(SnapshotVideoRecorder.this);
mPreview = null; mPreview = null;
if (mOverlaySurfaceTexture != null) {
mOverlaySurfaceTexture.release();
mOverlaySurfaceTexture = null;
}
if (mOverlaySurface != null) {
mOverlaySurface.release();
mOverlaySurface = null;
}
} }
} }

Loading…
Cancel
Save