From ea21b8b428d7366b6ac2c6fc01c7e0636e0fdced Mon Sep 17 00:00:00 2001 From: Mattia Iavarone Date: Tue, 29 Aug 2017 12:32:48 +0200 Subject: [PATCH] Simplify Camera1 threading --- .../com/otaliastudios/cameraview/Camera1.java | 83 ++++---------- .../com/otaliastudios/cameraview/Camera2.java | 67 +---------- .../cameraview/CameraController.java | 104 +++++++++++++++--- .../cameraview/WorkerHandler.java | 4 + 4 files changed, 112 insertions(+), 146 deletions(-) diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java index ce09e397..573caff9 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java @@ -27,24 +27,31 @@ class Camera1 extends CameraController { private static final String TAG = Camera1.class.getSimpleName(); - private static final int DELAY_MILLIS_BEFORE_RESETTING_FOCUS = 3000; - private int mCameraId; private Camera mCamera; - private ExtraProperties mExtraProperties; - private CameraOptions mOptions; - private Size mPreviewSize; - private Size mCaptureSize; private MediaRecorder mMediaRecorder; private File mVideoFile; - private int mDisplayOffset; - private int mDeviceOrientation; private int mSensorOffset; private Location mLocation; - private Handler mFocusHandler = new Handler(); + private final int mPostFocusResetDelay = 3000; + private Runnable mPostFocusResetRunnable = new Runnable() { + @Override + public void run() { + if (!isCameraOpened()) return; + mCamera.cancelAutoFocus(); + synchronized (mLock) { + Camera.Parameters params = mCamera.getParameters(); + params.setFocusAreas(null); + params.setMeteringAreas(null); + applyDefaultFocus(params); // Revert to internal focus. + mCamera.setParameters(params); + } + } + }; + private Mapper mMapper = new Mapper.Mapper1(); private boolean mIsSetup = false; private boolean mIsCapturingImage = false; @@ -160,7 +167,7 @@ class Camera1 extends CameraController { @WorkerThread @Override void onStop() { - mFocusHandler.removeCallbacksAndMessages(null); + mHandler.get().removeCallbacks(mPostFocusResetRunnable); if (isCameraOpened()) { if (mIsCapturingVideo) endVideo(); mCamera.stopPreview(); @@ -189,17 +196,6 @@ class Camera1 extends CameraController { return false; } - @Override - void onDisplayOffset(int displayOrientation) { - // I doubt this will ever change. - this.mDisplayOffset = displayOrientation; - } - - @Override - void onDeviceOrientation(int deviceOrientation) { - this.mDeviceOrientation = deviceOrientation; - } - @Override void setSessionType(SessionType sessionType) { @@ -394,7 +390,7 @@ class Camera1 extends CameraController { @Override public void onPictureTaken(byte[] data, final Camera camera) { mIsCapturingImage = false; - post(new Runnable() { + mHandler.post(new Runnable() { @Override public void run() { // This is needed, read somewhere in the docs. @@ -451,16 +447,6 @@ class Camera1 extends CameraController { return true; } - @Override - Size getCaptureSize() { - return mCaptureSize; - } - - @Override - Size getPreviewSize() { - return mPreviewSize; - } - @Override boolean shouldFlipSizes() { return mSensorOffset % 180 != 0; @@ -471,17 +457,6 @@ class Camera1 extends CameraController { return mCamera != null; } - @Nullable - @Override - ExtraProperties getExtraProperties() { - return mExtraProperties; - } - - @Nullable - @Override - CameraOptions getCameraOptions() { - return mOptions; - } // Internal: @@ -723,7 +698,8 @@ class Camera1 extends CameraController { public void onAutoFocus(boolean success, Camera camera) { // TODO lock auto exposure and white balance for a while mCameraCallbacks.dispatchOnFocusEnd(gesture, success, p); - postResetFocus(); + mHandler.get().removeCallbacks(mPostFocusResetRunnable); + mHandler.get().postDelayed(mPostFocusResetRunnable, mPostFocusResetDelay); } }); } @@ -731,25 +707,6 @@ class Camera1 extends CameraController { } - private void postResetFocus() { - mFocusHandler.removeCallbacksAndMessages(null); - mFocusHandler.postDelayed(new Runnable() { - @Override - public void run() { - if (!isCameraOpened()) return; - mCamera.cancelAutoFocus(); - synchronized (mLock) { - Camera.Parameters params = mCamera.getParameters(); - params.setFocusAreas(null); - params.setMeteringAreas(null); - applyDefaultFocus(params); // Revert to internal focus. - mCamera.setParameters(params); - } - } - }, DELAY_MILLIS_BEFORE_RESETTING_FOCUS); - } - - private List computeMeteringAreas(double viewClickX, double viewClickY) { // Event came in view coordinates. We must rotate to sensor coordinates. // First, rescale to the -1000 ... 1000 range. diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera2.java b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera2.java index 0cbad1ca..65158f6a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/Camera2.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/Camera2.java @@ -30,8 +30,6 @@ class Camera2 extends CameraController { private String mCameraId; - private Size mCaptureSize; - private Size mPreviewSize; private Mapper mMapper = new Mapper.Mapper2(); private final HashMap mExtraPropertiesMap = new HashMap<>(); @@ -189,57 +187,7 @@ class Camera2 extends CameraController { return false; } - @Override - Size getCaptureSize() { - if (mCaptureSize == null && mCameraCharacteristics != null) { - TreeSet sizes = new TreeSet<>(); - sizes.addAll(getAvailableCaptureResolutions()); - - /* TreeSet aspectRatios = new CommonAspectRatioFilter( - getAvailablePreviewResolutions(), - getAvailableCaptureResolutions() - ).filter(); - AspectRatio targetRatio = aspectRatios.size() > 0 ? aspectRatios.last() : null; - - Iterator descendingSizes = sizes.descendingIterator(); - Size size; - while (descendingSizes.hasNext() && mCaptureSize == null) { - size = descendingSizes.next(); - if (targetRatio == null || targetRatio.matches(size)) { - mCaptureSize = size; - break; - } - } */ - } - return mCaptureSize; - } - - @Override - Size getPreviewSize() { - if (mPreviewSize == null && mCameraCharacteristics != null) { - TreeSet sizes = new TreeSet<>(); - sizes.addAll(getAvailablePreviewResolutions()); - - /* TreeSet aspectRatios = new CommonAspectRatioFilter( - getAvailablePreviewResolutions(), - getAvailableCaptureResolutions() - ).filter(); - AspectRatio targetRatio = aspectRatios.size() > 0 ? aspectRatios.last() : null; - - Iterator descendingSizes = sizes.descendingIterator(); - Size size; - while (descendingSizes.hasNext() && mPreviewSize == null) { - size = descendingSizes.next(); - if (targetRatio == null || targetRatio.matches(size)) { - mPreviewSize = size; - break; - } - } */ - } - - return mPreviewSize; - } @Override boolean shouldFlipSizes() { @@ -256,22 +204,9 @@ class Camera2 extends CameraController { return true; } - @Nullable - @Override - ExtraProperties getExtraProperties() { - if (mCamera == null) { - return null; - } - return mExtraPropertiesMap.get(mCamera.getId()); - } - // Internal + // Internal - @Nullable - @Override - CameraOptions getCameraOptions() { - return null; - } private List getAvailableCaptureResolutions() { List output = new ArrayList<>(); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java index 28a30be1..81d6dd7e 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java @@ -20,7 +20,16 @@ abstract class CameraController implements Preview.SurfaceCallback { protected SessionType mSessionType; protected Hdr mHdr; - private WorkerHandler mHandler; + protected Size mCaptureSize; + protected Size mPreviewSize; + + protected ExtraProperties mExtraProperties; + protected CameraOptions mOptions; + + protected int mDisplayOffset; + protected int mDeviceOrientation; + + protected WorkerHandler mHandler; CameraController(CameraView.CameraCallbacks callback, Preview preview) { mCameraCallbacks = callback; @@ -29,10 +38,6 @@ abstract class CameraController implements Preview.SurfaceCallback { mHandler = new WorkerHandler("CameraViewController"); } - protected final void post(Runnable runnable) { - mHandler.post(runnable); - } - //region Start&Stop // Starts the preview asynchronously. @@ -65,38 +70,103 @@ abstract class CameraController implements Preview.SurfaceCallback { //endregion - abstract void onDisplayOffset(int displayOrientation); - abstract void onDeviceOrientation(int deviceOrientation); + //region Rotation callbacks + + void onDisplayOffset(int displayOrientation) { + // I doubt this will ever change. + mDisplayOffset = displayOrientation; + } + + void onDeviceOrientation(int deviceOrientation) { + mDeviceOrientation = deviceOrientation; + } + + //endregion + + //region Abstract setParameters abstract boolean setZoom(float zoom); + abstract boolean setExposureCorrection(float EVvalue); + abstract void setFacing(Facing facing); + abstract void setFlash(Flash flash); + abstract void setWhiteBalance(WhiteBalance whiteBalance); + abstract void setVideoQuality(VideoQuality videoQuality); + abstract void setSessionType(SessionType sessionType); + abstract void setHdr(Hdr hdr); + abstract void setLocation(Location location); + //endregion + + //region APIs + abstract boolean capturePicture(); + abstract boolean captureSnapshot(); + abstract boolean startVideo(@NonNull File file); + abstract boolean endVideo(); - abstract Size getCaptureSize(); - abstract Size getPreviewSize(); + abstract boolean shouldFlipSizes(); // Wheter the Sizes should be flipped to match the view orientation. + abstract boolean isCameraOpened(); abstract boolean startAutoFocus(@Nullable Gesture gesture, PointF point); - @Nullable abstract ExtraProperties getExtraProperties(); - @Nullable abstract CameraOptions getCameraOptions(); + //endregion + + //region final getters - final Facing getFacing() { return mFacing; } - final Flash getFlash() { return mFlash; } - final WhiteBalance getWhiteBalance() { return mWhiteBalance; } - final VideoQuality getVideoQuality() { return mVideoQuality; } - final SessionType getSessionType() { return mSessionType; } - final Hdr getHdr() { return mHdr; } + @Nullable + final ExtraProperties getExtraProperties() { + return mExtraProperties; + } + + @Nullable + final CameraOptions getCameraOptions() { + return mOptions; + } + + final Facing getFacing() { + return mFacing; + } + + final Flash getFlash() { + return mFlash; + } + + final WhiteBalance getWhiteBalance() { + return mWhiteBalance; + } + + final VideoQuality getVideoQuality() { + return mVideoQuality; + } + + final SessionType getSessionType() { + return mSessionType; + } + + final Hdr getHdr() { + return mHdr; + } + + final Size getCaptureSize() { + return mCaptureSize; + } + + final Size getPreviewSize() { + return mPreviewSize; + } + + //endregion } diff --git a/cameraview/src/main/utils/com/otaliastudios/cameraview/WorkerHandler.java b/cameraview/src/main/utils/com/otaliastudios/cameraview/WorkerHandler.java index 5b75660b..798d8366 100644 --- a/cameraview/src/main/utils/com/otaliastudios/cameraview/WorkerHandler.java +++ b/cameraview/src/main/utils/com/otaliastudios/cameraview/WorkerHandler.java @@ -20,6 +20,10 @@ class WorkerHandler { mHandler = new Handler(mThread.getLooper()); } + public Handler get() { + return mHandler; + } + public void post(Runnable runnable) { mHandler.post(runnable); }