Fix video snapshot rotation for Camera2

pull/502/head
Mattia Iavarone 6 years ago
parent 6672448ec5
commit ed34c67ef0
  1. 10
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera1Engine.java
  2. 12
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/Camera2Engine.java
  3. 14
      cameraview/src/main/java/com/otaliastudios/cameraview/engine/offset/Angles.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());

@ -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());

@ -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);
}
/**

Loading…
Cancel
Save