Simplify Camera1 threading

pull/13/head
Mattia Iavarone 8 years ago
parent b28d53121f
commit ea21b8b428
  1. 83
      cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java
  2. 67
      cameraview/src/main/java/com/otaliastudios/cameraview/Camera2.java
  3. 104
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraController.java
  4. 4
      cameraview/src/main/utils/com/otaliastudios/cameraview/WorkerHandler.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<Camera.Area> computeMeteringAreas(double viewClickX, double viewClickY) {
// Event came in view coordinates. We must rotate to sensor coordinates.
// First, rescale to the -1000 ... 1000 range.

@ -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<String, ExtraProperties> mExtraPropertiesMap = new HashMap<>();
@ -189,57 +187,7 @@ class Camera2 extends CameraController {
return false;
}
@Override
Size getCaptureSize() {
if (mCaptureSize == null && mCameraCharacteristics != null) {
TreeSet<Size> sizes = new TreeSet<>();
sizes.addAll(getAvailableCaptureResolutions());
/* TreeSet<AspectRatio> aspectRatios = new CommonAspectRatioFilter(
getAvailablePreviewResolutions(),
getAvailableCaptureResolutions()
).filter();
AspectRatio targetRatio = aspectRatios.size() > 0 ? aspectRatios.last() : null;
Iterator<Size> 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<Size> sizes = new TreeSet<>();
sizes.addAll(getAvailablePreviewResolutions());
/* TreeSet<AspectRatio> aspectRatios = new CommonAspectRatioFilter(
getAvailablePreviewResolutions(),
getAvailableCaptureResolutions()
).filter();
AspectRatio targetRatio = aspectRatios.size() > 0 ? aspectRatios.last() : null;
Iterator<Size> 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<Size> getAvailableCaptureResolutions() {
List<Size> output = new ArrayList<>();

@ -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
}

@ -20,6 +20,10 @@ class WorkerHandler {
mHandler = new Handler(mThread.getLooper());
}
public Handler get() {
return mHandler;
}
public void post(Runnable runnable) {
mHandler.post(runnable);
}

Loading…
Cancel
Save