Reimplement lock orientation using transforms

Reimplement the --lock-video-orientation feature using affine
transforms.
This commit is contained in:
Romain Vimont 2024-11-10 16:21:59 +01:00
parent 58c73504d4
commit 26d66a7c28
2 changed files with 27 additions and 0 deletions

View File

@ -35,6 +35,7 @@ public class ScreenCapture extends SurfaceCapture {
private final int displayId;
private int maxSize;
private final Rect crop;
private int lockVideoOrientation;
private DisplayInfo displayInfo;
private Size videoSize;
@ -64,6 +65,7 @@ public class ScreenCapture extends SurfaceCapture {
assert displayId != Device.DISPLAY_ID_NONE;
this.maxSize = options.getMaxSize();
this.crop = options.getCrop();
this.lockVideoOrientation = options.getLockVideoOrientation();
}
@Override
@ -136,6 +138,11 @@ public class ScreenCapture extends SurfaceCapture {
Size displaySize = displayInfo.getSize();
setSessionDisplaySize(displaySize);
if (lockVideoOrientation == Device.LOCK_VIDEO_ORIENTATION_INITIAL) {
// The user requested to lock the video orientation to the current orientation
lockVideoOrientation = displayInfo.getRotation();
}
VideoFilter filter = new VideoFilter(displaySize);
if (crop != null) {
@ -143,6 +150,10 @@ public class ScreenCapture extends SurfaceCapture {
filter.addCrop(crop, transposed);
}
if (lockVideoOrientation != Device.LOCK_VIDEO_ORIENTATION_UNLOCKED) {
filter.addLockVideoOrientation(lockVideoOrientation, displayInfo.getRotation());
}
transform = filter.getInverseTransform();
videoSize = filter.getOutputSize().limit(maxSize).round8();
}

View File

@ -61,4 +61,20 @@ public class VideoFilter {
transform = AffineMatrix.reframe(x, y, w, h).multiply(transform);
size = new Size(crop.width(), crop.height());
}
public void addRotation(int ccwRotation) {
if (ccwRotation == 0) {
return;
}
transform = AffineMatrix.rotateOrtho(ccwRotation).multiply(transform);
if (ccwRotation % 2 != 0) {
size = size.rotate();
}
}
public void addLockVideoOrientation(int lockVideoOrientation, int displayRotation) {
int ccwRotation = (4 + lockVideoOrientation - displayRotation) % 4;
addRotation(ccwRotation);
}
}