diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java index 9b3d4566..3b320da7 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/engine/MockCameraEngine.java @@ -128,7 +128,7 @@ public class MockCameraEngine extends CameraEngine { } @Override - protected void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio viewAspectRatio) { + protected void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio outputRatio) { } @@ -138,7 +138,7 @@ public class MockCameraEngine extends CameraEngine { } @Override - protected void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio viewAspectRatio) { + protected void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio outputRatio) { } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index e54bfaab..94259dd2 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -425,10 +425,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver { int height, width; if (freeWidth) { height = heightValue; - width = (int) (height / ratio); + width = Math.round(height / ratio); } else { width = widthValue; - height = (int) (width * ratio); + height = Math.round(width * ratio); } LOG.i("onMeasure:", "one dimension was free, we adapted it to fit the aspect ratio.", "(" + width + "x" + height + ")"); @@ -445,10 +445,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver { int height, width; if (freeWidth) { height = heightValue; - width = Math.min((int) (height / ratio), widthValue); + width = Math.min(Math.round(height / ratio), widthValue); } else { width = widthValue; - height = Math.min((int) (width * ratio), heightValue); + height = Math.min(Math.round(width * ratio), heightValue); } LOG.i("onMeasure:", "one dimension was EXACTLY, another AT_MOST.", "We have TRIED to fit the aspect ratio, but it's not guaranteed.", @@ -465,10 +465,10 @@ public class CameraView extends FrameLayout implements LifecycleObserver { if (atMostRatio >= ratio) { // We must reduce height. width = widthValue; - height = (int) (width * ratio); + height = Math.round(width * ratio); } else { height = heightValue; - width = (int) (height / ratio); + width = Math.round(height / ratio); } LOG.i("onMeasure:", "both dimension were AT_MOST.", "We fit the preview aspect ratio.", @@ -1465,9 +1465,8 @@ public class CameraView extends FrameLayout implements LifecycleObserver { * @see #takePicture() */ public void takePictureSnapshot() { - if (getWidth() == 0 || getHeight() == 0) return; PictureResult.Stub stub = new PictureResult.Stub(); - mCameraEngine.takePictureSnapshot(stub, AspectRatio.of(getWidth(), getHeight())); + mCameraEngine.takePictureSnapshot(stub); } @@ -1499,9 +1498,8 @@ public class CameraView extends FrameLayout implements LifecycleObserver { * @param file a file where the video will be saved */ public void takeVideoSnapshot(@NonNull File file) { - if (getWidth() == 0 || getHeight() == 0) return; VideoResult.Stub stub = new VideoResult.Stub(); - mCameraEngine.takeVideoSnapshot(stub, file, AspectRatio.of(getWidth(), getHeight())); + mCameraEngine.takeVideoSnapshot(stub, file); mUiHandler.post(new Runnable() { @Override public void run() { diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java index 5ee4a480..be9f9009 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java @@ -306,10 +306,9 @@ public class Camera1Engine extends CameraEngine implements @WorkerThread @Override - protected void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio viewAspectRatio) { + protected void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio outputRatio) { stub.size = getUncroppedSnapshotSize(Reference.OUTPUT); // Not the real size: it will be cropped to match the view ratio stub.rotation = getAngles().offset(Reference.SENSOR, Reference.OUTPUT, Axis.RELATIVE_TO_SENSOR); // Actually it will be rotated and set to 0. - AspectRatio outputRatio = getAngles().flip(Reference.OUTPUT, Reference.VIEW) ? viewAspectRatio.flip() : viewAspectRatio; if (mPreview instanceof GlCameraPreview && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { mPictureRecorder = new SnapshotGlPictureRecorder(stub, this, (GlCameraPreview) mPreview, outputRatio, getOverlay()); @@ -343,7 +342,7 @@ public class Camera1Engine extends CameraEngine implements @SuppressLint("NewApi") @WorkerThread @Override - protected void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio viewAspectRatio) { + protected void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio outputRatio) { if (!(mPreview instanceof GlCameraPreview)) { throw new IllegalStateException("Video snapshots are only supported with GlCameraPreview."); } @@ -355,7 +354,6 @@ public class Camera1Engine extends CameraEngine implements if (outputSize == null) { throw new IllegalStateException("outputSize should not be null."); } - AspectRatio outputRatio = getAngles().flip(Reference.VIEW, Reference.OUTPUT) ? viewAspectRatio.flip() : viewAspectRatio; Rect outputCrop = CropHelper.computeCrop(outputSize, outputRatio); outputSize = new Size(outputCrop.width(), outputCrop.height()); stub.size = outputSize; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java index 24c36554..6b3cf5c1 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -610,10 +610,9 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv @WorkerThread @Override - protected void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio viewAspectRatio) { + protected void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio outputRatio) { stub.size = getUncroppedSnapshotSize(Reference.OUTPUT); // Not the real size: it will be cropped to match the view ratio stub.rotation = getAngles().offset(Reference.SENSOR, Reference.OUTPUT, Axis.RELATIVE_TO_SENSOR); // Actually it will be rotated and set to 0. - AspectRatio outputRatio = getAngles().flip(Reference.OUTPUT, Reference.VIEW) ? viewAspectRatio.flip() : viewAspectRatio; if (mPreview instanceof GlCameraPreview) { mPictureRecorder = new SnapshotGlPictureRecorder(stub, this, (GlCameraPreview) mPreview, outputRatio, getOverlay()); } else { @@ -695,7 +694,7 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv @WorkerThread @Override - protected void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio viewAspectRatio) { + protected void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio outputRatio) { if (!(mPreview instanceof GlCameraPreview)) { throw new IllegalStateException("Video snapshots are only supported with GlCameraPreview."); } @@ -704,7 +703,6 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv if (outputSize == null) { throw new IllegalStateException("outputSize should not be null."); } - AspectRatio outputRatio = getAngles().flip(Reference.VIEW, Reference.OUTPUT) ? viewAspectRatio.flip() : viewAspectRatio; Rect outputCrop = CropHelper.computeCrop(outputSize, outputRatio); outputSize = new Size(outputCrop.width(), outputCrop.height()); stub.size = outputSize; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java index 2d2b1d60..a39907b2 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/CameraEngine.java @@ -1087,9 +1087,8 @@ public abstract class CameraEngine implements * The snapshot size is the {@link #getPreviewStreamSize(Reference)}, but cropped based on the * view/surface aspect ratio. * @param stub a picture stub - * @param viewAspectRatio the view aspect ratio */ - public final void takePictureSnapshot(final @NonNull PictureResult.Stub stub, @NonNull final AspectRatio viewAspectRatio) { + public final void takePictureSnapshot(final @NonNull PictureResult.Stub stub) { LOG.v("takePictureSnapshot", "scheduling"); mHandler.run(new Runnable() { @Override @@ -1101,7 +1100,9 @@ public abstract class CameraEngine implements stub.isSnapshot = true; stub.facing = mFacing; // Leave the other parameters to subclasses. - onTakePictureSnapshot(stub, viewAspectRatio); + //noinspection ConstantConditions + AspectRatio ratio = AspectRatio.of(getPreviewSurfaceSize(Reference.OUTPUT)); + onTakePictureSnapshot(stub, ratio); } }); } @@ -1155,9 +1156,8 @@ public abstract class CameraEngine implements /** * @param stub a video stub * @param file the output file - * @param viewAspectRatio the view aspect ratio */ - public final void takeVideoSnapshot(final @NonNull VideoResult.Stub stub, @NonNull final File file, @NonNull final AspectRatio viewAspectRatio) { + public final void takeVideoSnapshot(final @NonNull VideoResult.Stub stub, @NonNull final File file) { LOG.v("takeVideoSnapshot", "scheduling"); mHandler.run(new Runnable() { @Override @@ -1175,7 +1175,9 @@ public abstract class CameraEngine implements stub.audio = mAudio; stub.maxSize = mVideoMaxSize; stub.maxDuration = mVideoMaxDuration; - onTakeVideoSnapshot(stub, viewAspectRatio); + //noinspection ConstantConditions + AspectRatio ratio = AspectRatio.of(getPreviewSurfaceSize(Reference.OUTPUT)); + onTakeVideoSnapshot(stub, ratio); } }); } @@ -1220,10 +1222,10 @@ public abstract class CameraEngine implements protected abstract void onTakePicture(@NonNull PictureResult.Stub stub); @WorkerThread - protected abstract void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio viewAspectRatio); + protected abstract void onTakePictureSnapshot(@NonNull PictureResult.Stub stub, @NonNull AspectRatio outputRatio); @WorkerThread - protected abstract void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio viewAspectRatio); + protected abstract void onTakeVideoSnapshot(@NonNull VideoResult.Stub stub, @NonNull AspectRatio outputRatio); @WorkerThread protected abstract void onTakeVideo(@NonNull VideoResult.Stub stub);