Commit Graph
1991 Commits
Author SHA1 Message Date
Romain Vimont 84d593472e Move log message helpers to LogUtils
This class will also contain other log helpers.
2023-02-27 12:24:49 +01:00
Romain Vimont 67a80fbeca Quit on audio configuration failure
When audio capture fails on the device, scrcpy continue mirroring the
video stream. This allows to enable audio by default only when
supported.

However, if an audio configuration occurs (for example the user
explicitly selected an unknown audio encoder), this must be treated as
an error and scrcpy must exit.
2023-02-27 12:24:49 +01:00
Romain Vimont 9b2003b810 Add --list-encoders
Add an option to list the device encoders properly.
2023-02-27 12:24:49 +01:00
Romain Vimont 1787972fad Move await_for_server() logs
Print the logs on the caller side. This will allow to call the function
in another context without printing the logs.
2023-02-27 12:24:49 +01:00
Romain Vimont ea1fd8c84d Add --audio-encoder
Similar to --video-encoder, but for audio.
2023-02-27 12:24:49 +01:00
Romain Vimont f488be4cc5 Extract unknown encoder error message
This will allow to reuse the same code for audio encoder selection.
2023-02-27 12:24:49 +01:00
Romain Vimont c1df742b37 Add --audio-codec-options
Similar to --video-codec-options, but for audio.
2023-02-27 12:24:49 +01:00
Romain Vimont c0bf67fcdc Extract application of codec options
This will allow to reuse the same code for audio codec options.
2023-02-27 12:24:49 +01:00
Romain Vimont efb32e352b Add support for AAC audio codec
Add option --audio-codec=aac.
2023-02-27 12:24:49 +01:00
Romain Vimont 29992078d9 Add --audio-codec
Introduce the selection mechanism. Alternative codecs will be added
later.
2023-02-27 12:24:49 +01:00
Romain Vimont 3f6911d20b Add --audio-bit-rate
Add an option to configure the audio bit-rate.
2023-02-27 12:24:49 +01:00
Romain Vimont 3116e7f8cd Disable MethodLength checkstyle on createOptions()
This method will grow as needed to initialize options.
2023-02-27 12:24:49 +01:00
Romain Vimont dc99458cf1 Rename --encoder to --video-encoder
This prepares the introduction of --audio-encoder.
2023-02-27 12:24:49 +01:00
Romain Vimont ceaa83a8cd Rename --codec-options to --video-codec-options
This prepares the introduction of --audio-codec-options.
2023-02-27 12:24:49 +01:00
Romain Vimont f3a50cc046 Rename --bit-rate to --video-bit-rate
This prepares the introduction of --audio-bit-rate.
2023-02-27 12:24:49 +01:00
Romain Vimont aabd2ea12b Rename --codec to --video-codec
This prepares the introduction of --audio-codec.
2023-02-27 12:24:49 +01:00
Romain Vimont d2d64c9fa3 Remove default bit-rate on client side
If no bit-rate is passed, let the server use the default value (8Mbps).

This avoids to define a default value on both sides, and to pass the
default bit-rate as an argument when starting the server.
2023-02-27 12:24:49 +01:00
Romain Vimont edaca6f72d Record at least video packets on stop
If the recorder is stopped while it has not received any audio packet
yet, make sure the video stream is correctly recorded.
2023-02-27 12:24:49 +01:00
Romain Vimont 79f4abb9b3 Disable audio before Android 11
The permission "android.permission.RECORD_AUDIO" has been added for
shell in Android 11.

Moreover, on lower versions, it may make the server segfault on the
device (happened on a Nexus 5 with Android 6.0.1).

Refs <https://android.googlesource.com/platform/frameworks/base/+/4feeee88911503cc365b223a712437abcd91c94f%5E%21/>
2023-02-27 12:24:49 +01:00
Romain Vimont 3bd4ce1a11 Disable audio on initialization error
By default, audio is enabled (--no-audio must be explicitly passed to
disable it).

However, some devices may not support audio capture (typically devices
below Android 11, or Android 11 when the shell application is not
foreground on start).

In that case, make the server notify the client to dynamically disable
audio forwarding so that it does not wait indefinitely for an audio
stream.

Also disable audio on unknown codec or missing decoder on the
client-side, for the same reasons.
2023-02-27 12:24:49 +01:00
Romain Vimont 8438a76aa0 Add record audio support
Make the recorder accept two input sources (video and audio), and mux
them into a single file.
2023-02-27 12:24:49 +01:00
Romain Vimont 2f273b2298 Rename video-specific variables in recorder
This paves the way to add audio-specific variables.
2023-02-27 12:24:49 +01:00
Romain Vimont 7a2ebfae07 Do not merge config audio packets
For video streams (at least H.264 and H.265), the config packet
containing SPS/PPS must be prepended to the next packet (the following
keyframe).

For audio streams (at least OPUS), they must not be merged.
2023-02-27 12:24:49 +01:00
Romain Vimont 0263d8bbef Add an audio demuxer
Add a demuxer which will read the stream from the audio socket.
2023-02-27 12:24:49 +01:00
Romain Vimont 4aaa4580e6 Give a name to demuxer instances
This will be useful in logs.
2023-02-27 12:24:49 +01:00
Romain Vimont 51f4d0efae Rename demuxer to video_demuxer
There will be another demuxer instance for audio.
2023-02-27 12:24:49 +01:00
Romain Vimont 4824f846eb Extract OPUS extradata
For OPUS codec, FFmpeg expects the raw extradata, but MediaCodec wraps
it in some structure.

Fix the config packet to send only the raw extradata.
2023-02-27 12:24:49 +01:00
Romain Vimont 8ebdab2b04 Use a streamer to send the audio stream
Send each encoded audio packet using a streamer.
2023-02-27 12:24:49 +01:00
Romain Vimont 87ae5e17c5 Encode recorded audio on the device
For now, the encoded packets are just logged into the console.
2023-02-27 12:24:49 +01:00
Simon ChanandRomain Vimont fb4d0ac01b Capture device audio
Create an AudioRecorder to capture the audio source REMOTE_SUBMIX.

For now, the captured packets are just logged into the console.

Co-authored-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2023-02-27 12:24:49 +01:00
Simon ChanandRomain Vimont 953e9065c9 Add a new socket for audio stream
When audio is enabled, open a new socket to send the audio stream from
the device to the client.

Co-authored-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2023-02-27 12:24:49 +01:00
Simon ChanandRomain Vimont 15fb00df85 Add --no-audio option
Audio will be enabled by default (when supported). Add an option to
disable it.

Co-authored-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2023-02-27 12:24:49 +01:00
Romain Vimont 015f8b6930 Use FakeContext for Application instance
This will expose the correct package name and UID to the application
context.
2023-02-27 12:24:49 +01:00
Romain Vimont d55a136af4 Use shell package name for workarounds
For consistency.
2023-02-27 12:24:49 +01:00
Romain Vimont b314aca010 Use ROOT_UID from FakeContext
Remove USER_ID from ServiceManager, and replace it by a constant in
FakeContext.

This is the same as android.os.Process.ROOT_UID, but this constant has
been introduced in API 29.
2023-02-27 12:24:49 +01:00
Romain Vimont 1154b62ecf Use PACKAGE_NAME from FakeContext
Remove duplicated constant.
2023-02-27 12:24:49 +01:00
Romain VimontandSimon Chan 7fb1bc9131 Use AttributionSource from FakeContext
FakeContext already provides an AttributeSource instance.

Co-authored-by: Simon Chan <1330321+yume-chan@users.noreply.github.com>
2023-02-27 12:24:49 +01:00
Simon ChanandRomain Vimont f4508d5a1e Add a fake Android Context
Since scrcpy-server is not an Android application (it's a java
executable), it has no Context.

Some features will require a Context instance to get the package name
and the UID. Add a FakeContext for this purpose.

Co-authored-by: Romain Vimont <rom@rom1v.com>
Signed-off-by: Romain Vimont <rom@rom1v.com>
2023-02-27 12:24:49 +01:00
Romain Vimont ca74b960c3 Improve error message for unknown encoder
The provided encoder name depends on the selected codec. Improve the
error message and the suggestions.
2023-02-27 12:24:49 +01:00
Romain Vimont 537d445740 Rename "codec" variable to "mediaCodec"
This will allow to use "codec" for the Codec type.
2023-02-27 12:24:49 +01:00
Romain Vimont 99d30cfc3a Make streamer independent of codec type
Rename VideoStreamer to Streamer, and extract a Codec interface which
will also support audio codecs.
2023-02-27 12:24:49 +01:00
Romain Vimont d67a6aed34 Pass all args to ScreenEncoder constructor
There is no good reason to pass some of them in the constructor and some
others as parameters of the streamScreen() method.
2023-02-27 12:24:49 +01:00
Romain Vimont a6a3c4ca3d Move screen encoder initialization
This prepares further refactors.
2023-02-27 12:24:49 +01:00
Romain Vimont 74d1014b6d Write streamer header from ScreenEncoder
The screen encoder is responsible to write data to the video streamer.
2023-02-27 12:24:49 +01:00
Romain Vimont f38d3166c3 Use VideoStreamer directly from ScreenEncoder
The Callbacks interface notifies new packets. But in addition, the
screen encoder will need to write headers on start.

We could add a function onStart(), but for simplicity, just remove the
interface, which brings no value, and call the streamer directly.

Refs 87972e2022
2023-02-27 12:24:49 +01:00
Romain Vimont 6f5f20d36f Simplify error handling on socket creation
On any error, all previously opened sockets must be closed.

Handle these errors in a single catch-block. Currently, there are only 2
sockets, but this will simplify even more with more sockets.

Note: this commit is better displayed with --ignore-space-change (-b).
2023-02-27 12:24:49 +01:00
Romain Vimont e1a2ba6185 Reorder initialization
Initialize components in the pipeline order: demuxer first, decoder and
recorder second.
2023-02-27 12:24:49 +01:00
Romain Vimont cd2c4d3b0f Refactor recorder logic
Process the initial config packet (necessary to write the header)
separately.
2023-02-27 12:24:49 +01:00
Romain Vimont 7d22c0d354 Move last packet recording
Write the last packet at the end.
2023-02-27 12:24:49 +01:00
Romain Vimont 4d1d97d058 Add start() function for recorder
For consistency with the other components, do not start the internal
thread from an init() function.
2023-02-27 12:24:49 +01:00