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 1eaff96b..eae82d6d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java @@ -359,7 +359,17 @@ public class Camera1Engine extends CameraEngine implements Rect outputCrop = CropHelper.computeCrop(outputSize, outputRatio); outputSize = new Size(outputCrop.width(), outputCrop.height()); stub.size = outputSize; + // Vertical: 0 (270-0-0) + // Left (unlocked): 0 (270-90-270) + // Right (unlocked): 0 (270-270-90) + // Upside down (unlocked): 0 (270-180-180) + // Left (locked): 270 (270-0-270) + // Right (locked): 90 (270-0-90) + // Upside down (locked): 180 (270-0-180) + // The correct formula seems to be deviceOrientation+displayOffset, + // which means offset(Reference.VIEW, Reference.OUTPUT, Axis.ABSOLUTE). stub.rotation = getAngles().offset(Reference.VIEW, Reference.OUTPUT, Axis.ABSOLUTE); + LOG.i("onTakeVideoSnapshot", "rotation:", stub.rotation, "size:", stub.size); // Start. mVideoRecorder = new SnapshotVideoRecorder(Camera1Engine.this, glPreview, getOverlay()); 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 0cdfb452..2415231d 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java @@ -706,7 +706,17 @@ public class Camera2Engine extends CameraEngine implements ImageReader.OnImageAv Rect outputCrop = CropHelper.computeCrop(outputSize, outputRatio); outputSize = new Size(outputCrop.width(), outputCrop.height()); stub.size = outputSize; - stub.rotation = getAngles().offset(Reference.VIEW, Reference.OUTPUT, Axis.ABSOLUTE); + // Vertical: 0 (270-0-0) + // Left (unlocked): 270 (270-90-270) + // Right (unlocked): 90 (270-270-90) + // Upside down (unlocked): 180 (270-180-180) + // Left (locked): 270 (270-0-270) + // Right (locked): 90 (270-0-90) + // Upside down (locked): 180 (270-0-180) + // Unlike Camera1, the correct formula seems to be deviceOrientation, + // which means offset(Reference.BASE, Reference.OUTPUT, Axis.ABSOLUTE). + stub.rotation = getAngles().offset(Reference.BASE, Reference.OUTPUT, Axis.ABSOLUTE); + LOG.i("onTakeVideoSnapshot", "rotation:", stub.rotation, "size:", stub.size); // Start. mVideoRecorder = new SnapshotVideoRecorder(this, glPreview, getOverlay()); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/offset/Angles.java b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/offset/Angles.java index 56c9199b..a8718418 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/engine/offset/Angles.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/engine/offset/Angles.java @@ -3,6 +3,7 @@ package com.otaliastudios.cameraview.engine.offset; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; +import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.controls.Facing; /** @@ -21,6 +22,9 @@ import com.otaliastudios.cameraview.controls.Facing; */ public class Angles { + private final static String TAG = Angles.class.getSimpleName(); + private final static CameraLogger LOG = CameraLogger.create(TAG); + private Facing mSensorFacing; @VisibleForTesting int mSensorOffset = 0; @VisibleForTesting int mDisplayOffset = 0; @@ -40,6 +44,7 @@ public class Angles { if (mSensorFacing == Facing.FRONT) { mSensorOffset = sanitizeOutput(360 - mSensorOffset); } + print(); } /** @@ -49,6 +54,7 @@ public class Angles { public void setDisplayOffset(int displayOffset) { sanitizeInput(displayOffset); mDisplayOffset = displayOffset; + print(); } /** @@ -58,6 +64,14 @@ public class Angles { public void setDeviceOrientation(int deviceOrientation) { sanitizeInput(deviceOrientation); mDeviceOrientation = deviceOrientation; + print(); + } + + private void print() { + LOG.i("Angles changed:", + "sensorOffset:", mSensorOffset, + "displayOffset:", mDisplayOffset, + "deviceOrientation:", mDeviceOrientation); } /**