diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/Issue514Workaround.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/Issue514Workaround.java new file mode 100644 index 00000000..5cf0909b --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/Issue514Workaround.java @@ -0,0 +1,29 @@ +package com.otaliastudios.cameraview.internal; + +import android.graphics.SurfaceTexture; + +import androidx.annotation.NonNull; + +import com.otaliastudios.cameraview.size.Size; + +/** + * Fixes an issue for some devices with snapshot picture and video recording. + * This is so dirty and totally unclear that I wanted to have a separate class. + */ +public class Issue514Workaround { + + private final SurfaceTexture surfaceTexture; + + public Issue514Workaround(int cameraTextureId, @NonNull Size size) { + surfaceTexture = new SurfaceTexture(cameraTextureId); + surfaceTexture.setDefaultBufferSize(size.getWidth(), size.getHeight()); + } + + public void onStart() { + surfaceTexture.updateTexImage(); + } + + public void onEnd() { + surfaceTexture.release(); + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java index 16c5cbe2..2fd05ca0 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/SnapshotGlPictureRecorder.java @@ -14,6 +14,7 @@ import android.os.Build; import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.PictureResult; +import com.otaliastudios.cameraview.internal.Issue514Workaround; import com.otaliastudios.cameraview.internal.egl.EglBaseSurface; import com.otaliastudios.cameraview.overlay.Overlay; import com.otaliastudios.cameraview.controls.Facing; @@ -168,11 +169,13 @@ public class SnapshotGlPictureRecorder extends PictureRecorder { final int fakeOutputTextureId = 9999; SurfaceTexture fakeOutputSurface = new SurfaceTexture(fakeOutputTextureId); fakeOutputSurface.setDefaultBufferSize(mResult.size.getWidth(), mResult.size.getHeight()); + final Issue514Workaround issue514Workaround = new Issue514Workaround(mTextureId, mResult.size); // 1. Create an EGL surface final EglCore core = new EglCore(eglContext, EglCore.FLAG_RECORDABLE); final EglBaseSurface eglSurface = new EglWindowSurface(core, fakeOutputSurface); eglSurface.makeCurrent(); + issue514Workaround.onStart(); // 2. Apply scale and crop boolean flip = mEngine.getAngles().flip(Reference.VIEW, Reference.SENSOR); @@ -222,6 +225,7 @@ public class SnapshotGlPictureRecorder extends PictureRecorder { mResult.data = eglSurface.saveFrameTo(Bitmap.CompressFormat.JPEG); // 6. Cleanup + issue514Workaround.onEnd(); eglSurface.releaseEglSurface(); mViewport.release(); fakeOutputSurface.release();