Romain Vimont
c8eb5cc6e3
Handle errors using gotos in recorder_open()
...
There are many initializations in recorder_open(). Handle RAII-like
deinitialization using gotos.
2021-04-19 20:19:15 +02:00
Romain Vimont
49582e4a2e
Initialize recorder fields on open
...
Only initialize ops and parameters copy from recorder_init(). It was
inconsistent to initialize some fields from _init() and some others from
_open().
2021-04-19 20:19:15 +02:00
Romain Vimont
99c6a76eb5
Hide the window immediately on close
...
The screen may not be destroyed immediately on close to avoid undefined
behavior, because it may still receive events from the decoder.
But the visual window must still be closed immediately.
2021-04-19 20:19:15 +02:00
Romain Vimont
c9a5611382
Assert screen closed on destroy
...
The destruction order is important, but tricky, because the screen is
open/close by the decoder, but destroyed by scrcpy.c on the main thread.
Add assertions to guarantee that the screen is not destroyed before
being closed.
2021-04-19 20:19:15 +02:00
Romain Vimont
7309a573dc
Remove video_buffer callbacks
...
Now that screen is both the owner and the listener of the video buffer,
execute the code directly without callbacks.
2021-04-19 20:19:15 +02:00
Romain Vimont
8ede4b3f58
Move video_buffer to screen
...
The video buffer is now an internal detail of the screen component.
Since the screen is plugged to the decoder via the frame sink trait, the
decoder does not access to the video buffer anymore.
2021-04-19 20:19:15 +02:00
Romain Vimont
cec5bcbe0b
Make decoder push frames to sinks
...
Now that screen implements the packet sink trait, make decoder push
packets to the sinks without depending on the concrete sink types.
2021-04-19 20:19:15 +02:00
Romain Vimont
6d8f0a247f
Expose screen as frame sink
...
Make screen implement the frame sink trait.
This will allow the decoder to push frames without depending on the
concrete sink type.
2021-04-19 20:19:15 +02:00
Romain Vimont
bb6ac2b084
Add frame sink trait
...
This trait will allow to abstract the concrete sink types from the frame
producer (decoder.c).
2021-04-19 20:19:15 +02:00
Romain Vimont
eb971390ed
Make stream push packets to sinks
...
Now that decoder and recorder implement the packet sink trait, make
stream push packets to the sinks without depending on the concrete sink
types.
2021-04-19 20:19:15 +02:00
Romain Vimont
f27403e27f
Expose decoder as packet sink
...
Make decoder implement the packet sink trait.
This will allow the stream to push packets without depending on the
concrete sink type.
2021-04-19 20:19:15 +02:00
Romain Vimont
f82aab2057
Reorder decoder functions
...
This will make further commits more readable.
2021-04-19 20:19:15 +02:00
Romain Vimont
71327e82cb
Expose recorder as packet sink
...
Make recorder implement the packet sink trait.
This will allow the stream to push packets without depending on the
concrete sink type.
2021-04-19 20:19:15 +02:00
Romain Vimont
fea3f29ffd
Privatize recorder threading
...
The fact that the recorder uses a separate thread is an internal detail,
so the functions _start(), _stop() and _join() should not be exposed.
Instead, start the thread on _open() and _stop()+_join() on close().
This paves the way to expose the recorder as a packet sink trait.
2021-04-19 20:19:15 +02:00
Romain Vimont
fb07f4af55
Reorder recorder functions
...
This will make further commits more readable.
2021-04-19 20:19:15 +02:00
Romain Vimont
1116502704
Add packet sink trait
...
This trait will allow to abstract the concrete sink types from the
packet producer (stream.c).
2021-04-19 20:19:15 +02:00
Romain Vimont
321bf79a0b
Add container_of() macro
...
This will allow to get the parent of an embedded struct.
2021-04-19 20:19:15 +02:00
Romain Vimont
85f6f32b9e
Make video_buffer more generic
...
The video buffer took ownership of the producer frame (so that it could
swap frames quickly).
In order to support multiple sinks plugged to the decoder, the decoded
frame must not be consumed by the display video buffer.
Therefore, move the producer and consumer frames out of the video
buffer, and use FFmpeg AVFrame refcounting to share ownership while
avoiding copies.
2021-04-19 20:19:15 +02:00
Romain Vimont
7bb17e1abc
Remove compat with old FFmpeg codec params API
...
The new API has been introduced in 2016 in libavformat 57.xx, it's very
old.
This will avoid to maintain two code paths for codec parameters.
2021-04-19 20:19:15 +02:00
Romain Vimont
adaa88952d
Remove compat with old FFmpeg decoding API
...
The new API has been introduced in 2016 in libavcodec 57.xx, it's very
old.
This will avoid to maintain two code paths for decoding.
2021-04-19 20:19:15 +02:00
Romain Vimont
8bae1f6b7f
Remove option --render-expired-frames
...
This flag forced the decoder to wait for the previous frame to be
consumed by the display.
It was initially implemented as a compilation flag for testing, not
intended to be exposed at runtime. But to remove ifdefs and to allow
users to test this flag easily, it had finally been exposed by commit
ebccb9f6cc111e8acfbe10d656cac5c1f1b744a0.
In practice, it turned out to be useless: it had no practical impact,
and it did not solve or mitigate any performance issues causing frame
skipping.
But that added some complexity to the codebase: it required an
additional condition variable, and made video buffer calls possibly
blocking, which in turn required code to interrupt it on exit.
To prepare support for multiple sinks plugged to the decoder (display
and v4l2 for example), the blocking call used for pacing the decoder
output becomes unacceptable, so just remove this useless "feature".
2021-04-19 20:19:15 +02:00
Romain Vimont
e3da97a80f
Write trailer from recorder thread
...
The recorder thread wrote the whole content except the trailer, which
was odd.
2021-04-19 20:19:15 +02:00
brunoais
b9c3f65fd8
Provide actions for the extra mouse buttons
...
Bind APP_SWITCH to button 4 and expand notification panel on button 5.
PR #2258 <https://github.com/Genymobile/scrcpy/pull/2258 >
Signed-off-by: Romain Vimont <rom@rom1v.com>
2021-04-19 20:16:45 +02:00
Romain Vimont
d0739911a3
Forward DOWN and UP separately for right-click
...
The shortcut "back on screen on" is a bit special: the control is
requested by the client, but the actual event injection (POWER or BACK)
is determined on the device.
To properly inject DOWN and UP events for BACK, transmit the action as
a control parameter.
If the screen is off:
- on DOWN, inject POWER (DOWN and UP) (wake up the device immediately)
- on UP, do nothing
If the screen is on:
- on DOWN, inject BACK DOWN
- on UP, inject BACK UP
A corner case is when the screen turns off between the DOWN and UP
event. In that case, a BACK UP event will be injected, so it's harmless.
As a consequence of this change, the BACK button is now handled by
Android on mouse released. This is consistent with the keyboard shortcut
(Mod+b) behavior.
PR #2259 <https://github.com/Genymobile/scrcpy/pull/2259 >
Refs #2258 <https://github.com/Genymobile/scrcpy/pull/2258 >
2021-04-19 20:16:45 +02:00
Romain Vimont
964b6d2243
Forward DOWN and UP separately for middle-click
...
As a consequence of this change, the HOME button is now handled by
Android on mouse released. This is consistent with the keyboard shortcut
(MOD+h) behavior.
PR #2259 <https://github.com/Genymobile/scrcpy/pull/2259 >
Refs #2258 <https://github.com/Genymobile/scrcpy/pull/2258 >
2021-04-17 18:04:24 +02:00
Romain Vimont
8cc057c8f1
Prevent forwarding only "mouse released" events
...
Some mouse clicks DOWN are captured for shortcuts, but the matching UP
events were still forwarded to the device.
Instead, capture both DOWN and UP for shortcuts, and do nothing on UP.
PR #2259 <https://github.com/Genymobile/scrcpy/pull/2259 >
Refs #2258 <https://github.com/Genymobile/scrcpy/pull/2258 >
2021-04-17 18:04:13 +02:00
Romain Vimont
edee69d637
Fix options alphabetical order
...
"verbosity" < "version"
2021-04-16 17:40:39 +02:00
Romain Vimont
8ef4c044fa
Do not forward SDL_DROPFILE event
...
The event is handled by scrcpy.c, it is not necessary to send it to
screen or input_manager.
2021-04-13 22:37:08 +02:00
Romain Vimont
c23c38f99d
Move resizing workaround to screen.c
2021-04-13 22:36:59 +02:00
Romain Vimont
65c4f487b3
Set initial fullscreen from screen.c
2021-04-13 22:15:05 +02:00
Romain Vimont
c6d7f5ee96
Make screen_show_window() static
...
It is only used from screen.c now.
2021-04-13 22:04:38 +02:00
Romain Vimont
28f6cbaea6
Destroy screen once stream is finished
...
The screen receives callbacks from the decoder, fed by the stream.
The decoder is run from the stream thread, so waiting for the end of
stream is sufficient to avoid possible use-after-destroy.
2021-04-11 14:42:09 +02:00
Romain Vimont
08fc6694e1
Do not destroy uninitialized screen
...
When --no-display was passed, screen_destroy() was called while
screen_init() was never called.
In practice, it did not crash because it just freed NULL pointers, but
it was still incorrect.
2021-04-11 13:07:44 +02:00
Romain Vimont
d0983db592
Make internal recorder function static
2021-04-10 18:48:52 +02:00
Romain Vimont
fb7870500a
Remove unused field from input_manager
2021-04-10 18:48:52 +02:00
Romain Vimont
33006561c7
Remove useless forward declaration from stream.h
2021-04-10 18:48:52 +02:00
Romain Vimont
a09733d175
Remove useless includes from decoder.c
2021-04-10 18:48:44 +02:00
Romain Vimont
6231f683af
Fix compilation error for old decoding API
...
Commits cb9c42bdcb198b0e3ebed893e00257b95f4dcedb and
441d3fb119ce05287e94b0ae0befbb2e75173688 updated the code only for the
new decoding API.
2021-04-05 22:35:14 +02:00
Romain Vimont
9826c5c4a4
Remove HiDPI compilation flag
...
Always enable HiDPI support, there is no reason to expose a compilation
flag.
2021-04-04 15:00:13 +02:00
Yu-Chen Lin
1d615a0d51
Support power off on close
...
PR #824 <https://github.com/Genymobile/scrcpy/pull/824 >
Signed-off-by: Yu-Chen Lin <npes87184@gmail.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2021-03-16 21:12:35 +01:00
Yu-Chen Lin
fb0bcaebc2
Export static method to power off screen in Device
...
PR #824 <https://github.com/Genymobile/scrcpy/pull/824 >
Signed-off-by: Yu-Chen Lin <npes87184@gmail.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2021-03-16 21:12:29 +01:00
slingmint
dd453ad041
Pass scrcpy-noconsole arguments through to scrcpy
...
PR #2052 <https://github.com/Genymobile/scrcpy/pull/2052 >
Signed-off-by: Romain Vimont <rom@rom1v.com>
2021-03-16 21:04:04 +01:00
Romain Vimont
0308ef43f2
Do not set buttons on touch events
...
BUTTON_PRIMARY must not be set for touch events:
> This button constant is not set in response to simple touches with a
> finger or stylus tip. The user must actually push a button.
<https://developer.android.com/reference/android/view/MotionEvent#BUTTON_PRIMARY >
Fixes #2169 <https://github.com/Genymobile/scrcpy/issues/2169 >
2021-03-15 18:46:56 +01:00
Romain Vimont
40febf4a91
Use device id 0 for touch/mouse events
...
Virtual device is only for keyboard sources, not mouse or touchscreen
sources. Here is the value of InputDevice.getDevice(-1).toString():
Input Device -1: Virtual
Descriptor: ...
Generation: 2
Location: built-in
Keyboard Type: alphabetic
Has Vibrator: false
Has mic: false
Sources: 0x301 ( keyboard dpad )
InputDevice.getDeviceId() documentation says:
> An id of zero indicates that the event didn't come from a physical
> device and maps to the default keymap.
<https://developer.android.com/reference/android/view/InputEvent#getDeviceId() >
However, injecting events with a device id of 0 causes event.getDevice()
to be null on the client-side.
Commit 26529d377fe8aae2fd1ffa91405aa801a0ce8a57 used -1 as a workaround
to avoid a NPE on a specific Android TV device. But this is a bug in the
device system, which wrongly assumes that input device may not be null.
A similar issue was present in Flutter, but it is now fixed:
- <https://github.com/flutter/flutter/issues/30665 >
- <https://github.com/flutter/engine/pull/7986 >
On the other hand, using an id of -1 for touchscreen events (which is
invalid) causes issues for some apps:
<https://github.com/Genymobile/scrcpy/issues/2125#issuecomment-790535792 >
Therefore, use a device id of 0.
An alternative could be to find an existing device matching the source,
like "adb shell input" does. See getInputDeviceId():
<https://android.googlesource.com/platform/frameworks/base.git/+/master/cmds/input/src/com/android/commands/input/Input.java >
But it seems better to indicate that the event didn't come from a
physical device, and it would not solve #962 anyway, because an Android
TV has no touchscreen.
Refs #962 <https://github.com/Genymobile/scrcpy/issues/962 >
Fixes #2125 <https://github.com/Genymobile/scrcpy/issues/2125 >
2021-03-14 18:30:56 +01:00
Romain Vimont
429fdef04f
Fix encoder parameter suggestion
...
The option is --encoder, not --encoder-name.
2021-03-11 10:55:12 +01:00
Biswapriyo Nath
d1789f082a
meson: Do not use full path with mingw tools name
...
This helps to use mingw toolchains which are not in /usr/bin path.
PR #2185 <https://github.com/Genymobile/scrcpy/pull/2185 >
Signed-off-by: Romain Vimont <rom@rom1v.com>
2021-03-09 09:59:57 +01:00
Romain Vimont
eb7e1070cf
Release frame data as soon as possible
...
During a frame swap, one of the two frames involved can be released.
2021-03-06 22:58:03 +01:00
Romain Vimont
386f017ba9
Factorize frame swap
2021-03-06 22:58:03 +01:00
Romain Vimont
cc48b24324
Simplify screen initialization
...
Use a single function to initialize the screen instance.
2021-03-06 22:58:03 +01:00
Romain Vimont
597c54f049
Group screen parameters into a struct
...
The function screen_init_rendering had too many parameters.
2021-03-06 22:58:03 +01:00