From 06385ce83bcfd57ac82e2f5ca4d9575fe1f1649f Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 10 Nov 2024 16:21:59 +0100 Subject: [PATCH] Reimplement lock orientation using transforms Reimplement the --lock-video-orientation feature using affine transforms. Fixes #4011 PR #5455 --- .../genymobile/scrcpy/video/ScreenCapture.java | 11 +++++++++++ .../com/genymobile/scrcpy/video/VideoFilter.java | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java b/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java index 79d4974d..bc0f825a 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/ScreenCapture.java @@ -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(); } diff --git a/server/src/main/java/com/genymobile/scrcpy/video/VideoFilter.java b/server/src/main/java/com/genymobile/scrcpy/video/VideoFilter.java index 5a52231f..2d570446 100644 --- a/server/src/main/java/com/genymobile/scrcpy/video/VideoFilter.java +++ b/server/src/main/java/com/genymobile/scrcpy/video/VideoFilter.java @@ -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); + } }