Deprecate --lock-video-orientation in favor of a more general option
--capture-orientation, which supports all possible orientations
(0, 90, 180, 270, flip0, flip90, flip180, flip270), and a "locked" flag
via a '@' prefix.
All the old "locked video orientations" are supported:
- --lock-video-orientation -> --capture-orientation=@
- --lock-video-orientation=0 -> --capture-orientation=@0
- --lock-video-orientation=90 -> --capture-orientation=@90
- --lock-video-orientation=180 -> --capture-orientation=@180
- --lock-video-orientation=270 -> --capture-orientation=@270
In addition, --capture-orientation can rotate/flip the display without
locking, so that it follows the physical device rotation.
For example:
scrcpy --capture-orientation=flip90
always flips and rotates the capture by 90° clockwise.
The arguments are consistent with --display-orientation and
--record-orientation and --orientation (which provide separate
client-side orientation settings).
Refs #4011 <https://github.com/Genymobile/scrcpy/issues/4011>
PR #5455 <https://github.com/Genymobile/scrcpy/pull/5455>
Detecting display size changes is not straightforward:
- from a DisplayListener, "display changed" events are received, but
this does not imply that the size has changed (it must be checked);
- on Android 14 (see e26bdb07a2),
"display changed" events are not received on some versions, so as a
fallback, a RotationWatcher and a DisplayFoldListener are registered,
but unregistered as soon as a "display changed" event is actually
received, which means that the problem is fixed.
Extract a "display size monitor" to share the code between screen
capture and virtual display capture.
PR #5455 <https://github.com/Genymobile/scrcpy/pull/5455>
Reset video capture/encoding on MOD+Shift+r.
Like on device rotation, this starts a new encoding session which
produces a video stream starting by a key frame.
PR #5432 <https://github.com/Genymobile/scrcpy/pull/5432>
When the capture source becomes "invalid" (because the display size
changes for example), a reset request is performed to restart the
encoder.
The reset state was stored in SurfaceCapture. The capture implementation
set the flag, and the encoder consumed it.
However, this mechanism did not allow a reset request to _interrupt_ the
encoder, which may be waiting on a blocking call (until a new frame is
produced).
To be able to interrupt the encoder, a reset request must not only set a
flag, but run a callback provided by the encoder. For that purpose,
introduce the CaptureListener interface, which is notified by the
SurfaceCapture implementation whenever the capture is invalidated.
For now, the listener implementation just set a flag as before, so the
behavior is unchanged. It lays the groundwork for the next commits.
PR #5432 <https://github.com/Genymobile/scrcpy/pull/5432>
While moving code, commit 874eaec487 added
a condition `if (displayId == 0)` to register a rotation watcher,
without good reasons.
This condition was kept when the rotation watcher was moved to a
fallback in e26bdb07a2.
Note: use `git show -b` to show this commit ignoring whitespace changes.
Refs #5428 <https://github.com/Genymobile/scrcpy/issues/5428>
When a new capture starts, send a new PositionMapper to the Controller
without using the global Device as an intermediate.
Now all Device methods are static.
PR #5370 <https://github.com/Genymobile/scrcpy/pull/5370>
Extract the function that converts coordinates from video space to
display space into a separate component.
It only requires the specific data it uses and does not need a full
ScreenInfo object (although it can be created from a ScreenInfo
instance).
PR #5370 <https://github.com/Genymobile/scrcpy/pull/5370>
Add a function called before each capture starts (before getSize() is
called).
This allows to compute the ScreenInfo instance once exactly when needed.
PR #5370 <https://github.com/Genymobile/scrcpy/pull/5370>
Move the code related to screen size and rotation/fold to ScreenCapture.
For now, keep the ScreenInfo instance in the Device class to communicate
with the Controller, but it will be removed by further commits.
PR #5370 <https://github.com/Genymobile/scrcpy/pull/5370>
Moving classes into subpackages changed the expected imports order.
Reorganize them all at once automatically to avoid spurious changes in
future commits.