mirror of
https://github.com/Genymobile/scrcpy
synced 2025-01-02 20:52:06 +00:00
Reimplement lock orientation using transforms
Reimplement the --lock-video-orientation feature using affine transforms. Fixes #4011 <https://github.com/Genymobile/scrcpy/issues/4011> PR #5455 <https://github.com/Genymobile/scrcpy/pull/5455>
This commit is contained in:
parent
9fb0a3dac1
commit
06385ce83b
@ -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();
|
||||
}
|
||||
|
@ -66,4 +66,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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user