From bb83bbb55a3dbf333a2794100d3196f79b69bdb2 Mon Sep 17 00:00:00 2001 From: Ben Date: Fri, 24 Nov 2023 17:56:08 +0800 Subject: [PATCH] update video capturer --- .../MirrorVideoCapturer.java | 50 ++++++++++++------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/Basic-Video-Capturer-Camera-2-Java/app/src/main/java/com/tokbox/sample/basicvideocapturercamera2/MirrorVideoCapturer.java b/Basic-Video-Capturer-Camera-2-Java/app/src/main/java/com/tokbox/sample/basicvideocapturercamera2/MirrorVideoCapturer.java index ee270f0d..3f66c0e6 100644 --- a/Basic-Video-Capturer-Camera-2-Java/app/src/main/java/com/tokbox/sample/basicvideocapturercamera2/MirrorVideoCapturer.java +++ b/Basic-Video-Capturer-Camera-2-Java/app/src/main/java/com/tokbox/sample/basicvideocapturercamera2/MirrorVideoCapturer.java @@ -71,6 +71,7 @@ private enum CameraState { private Runnable executeAfterClosed; private Runnable executeAfterCameraOpened; + private Runnable executeAfterCameraSessionConfigured; private static final SparseIntArray rotationTable = new SparseIntArray() { { @@ -195,6 +196,7 @@ public void onImageAvailable(ImageReader reader) { @Override public void onConfigured(CameraCaptureSession session) { Log.d(TAG,"CameraCaptureSession.StateCallback onConfigured() enter."); + try { cameraState = CameraState.CAPTURE; captureSession = session; @@ -204,6 +206,11 @@ public void onConfigured(CameraCaptureSession session) { e.printStackTrace(); } Log.d(TAG,"CameraCaptureSession.StateCallback onConfigured() exit."); + + if (executeAfterCameraSessionConfigured != null) { + executeAfterCameraSessionConfigured.run(); + executeAfterCameraSessionConfigured = null; + } } @Override @@ -296,8 +303,8 @@ public Camera2Exception(String message) { /* Constructors etc... */ public MirrorVideoCapturer(Context ctx, - Publisher.CameraCaptureResolution resolution, - Publisher.CameraCaptureFrameRate fps) { + Publisher.CameraCaptureResolution resolution, + Publisher.CameraCaptureFrameRate fps) { cameraManager = (CameraManager) ctx.getSystemService(Context.CAMERA_SERVICE); display = ((WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); camera = null; @@ -337,14 +344,10 @@ private void doInit() { public synchronized void init() { Log.d(TAG,"init() enter"); - if (cameraState == CameraState.CLOSING) { - executeAfterClosed = () -> doInit(); - } else { - doInit(); - } + doInit(); cameraState = CameraState.SETUP; - Log.d(TAG,"init() exit"); + Log.d(TAG,"init() exit"); } private int doStartCapture() { @@ -440,9 +443,8 @@ public synchronized int scheduleStartCapture() { */ @Override public synchronized int stopCapture() { - Log.d(TAG,"stopCapture enter"); - if (null != camera && null != captureSession && CameraState.CLOSED != cameraState) { - cameraState = CameraState.CLOSING; + Log.d(TAG,"stopCapture() enter (cameraState: " + cameraState + ")"); + if (null != camera && null != captureSession && CameraState.CAPTURE == cameraState) { try { captureSession.stopRepeating(); } catch (CameraAccessException e) { @@ -450,11 +452,23 @@ public synchronized int stopCapture() { } captureSession.close(); cameraInfoCache = null; + cameraState = CameraState.CLOSING; } else if (null != camera && CameraState.OPEN == cameraState) { cameraState = CameraState.CLOSING; camera.close(); } else if (CameraState.SETUP == cameraState) { - executeAfterCameraOpened = null; + executeAfterCameraOpened = () -> { + cameraState = CameraState.CLOSING; + if (camera != null) { + camera.close(); + } + }; + } else if (CameraState.CREATESESSION == cameraState) { + executeAfterCameraSessionConfigured = () -> { + captureSession.close(); + cameraState = CameraState.CLOSING; + executeAfterCameraSessionConfigured = null; + }; } Log.d(TAG,"stopCapture exit"); return 0; @@ -693,20 +707,20 @@ private Range selectCameraFpsRange(String camId, final int fps) throws List> fpsLst = new ArrayList<>(); Collections.addAll(fpsLst, info.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES)); - /* sort list by error from desired fps * - * Android seems to do a better job at color correction/avoid 'dark frames' issue by - * selecting camera settings with the smallest lower bound on allowed frame rate - * range. */ - return Collections.min(fpsLst, new Comparator>() { + + Log.d(TAG,"Supported fps ranges = " + fpsLst); + Range selectedRange = Collections.min(fpsLst, new Comparator>() { @Override public int compare(Range lhs, Range rhs) { return calcError(lhs) - calcError(rhs); } private int calcError(Range val) { - return val.getLower() + Math.abs(val.getUpper() - fps); + return Math.abs(val.getLower() - fps) + Math.abs(val.getUpper() - fps); } }); + Log.d(TAG,"Desired fps = " + fps + " || Selected frame rate range = " + selectedRange); + return selectedRange; } } return null;