Compare commits
52 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2788e442b2 | ||
|
|
cbe346e650 | ||
|
|
4abea38f55 | ||
|
|
87afca911f | ||
|
|
153b17390b | ||
|
|
d2447ab54e | ||
|
|
a437a4e4b8 | ||
|
|
3610c240d2 | ||
|
|
0d3487badd | ||
|
|
28edc6e361 | ||
|
|
70d93dabea | ||
|
|
631b2cc1c9 | ||
|
|
6970add8cb | ||
|
|
7b9849bacc | ||
|
|
384b7f25dd | ||
|
|
3eefe524a9 | ||
|
|
aff62bf125 | ||
|
|
087e20ce18 | ||
|
|
6e1d79eef9 | ||
|
|
86d93ceee6 | ||
|
|
371735e0b7 | ||
|
|
76d0934830 | ||
|
|
d329f7cab7 | ||
|
|
494ab7cd3d | ||
|
|
57ba2073be | ||
|
|
371f569ea7 | ||
|
|
b7633d6384 | ||
|
|
b24f343c5c | ||
|
|
2d68c2c3ff | ||
|
|
a330201984 | ||
|
|
c4396d50fa | ||
|
|
2fb4b356bd | ||
|
|
ef87d013fe | ||
|
|
1af9554af8 | ||
|
|
c18c8cd6a0 | ||
|
|
47b4b5afc7 | ||
|
|
b11aedf7a8 | ||
|
|
d859603a7a | ||
|
|
463486692c | ||
|
|
cfd7d65f51 | ||
|
|
b98ae9f2ea | ||
|
|
fd80519310 | ||
|
|
8309aa41ea | ||
|
|
5b7915e5ec | ||
|
|
35fd54b7ea | ||
|
|
7edc8a4260 | ||
|
|
5d5f1a7433 | ||
|
|
97b06cca82 | ||
|
|
0a151b96fe | ||
|
|
ebecbe6bc6 | ||
|
|
d5dff239c8 | ||
|
|
5cf86ef7ff |
@@ -31,6 +31,10 @@ Select an audio codec (opus or aac).
|
|||||||
|
|
||||||
Default is opus.
|
Default is opus.
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BI "\-\-audio\-encoder " name
|
||||||
|
Use a specific MediaCodec audio encoder (depending on the codec provided by \fB\-\-audio\-codec\fR).
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BI "\-b, \-\-bit\-rate " value
|
.BI "\-b, \-\-bit\-rate " value
|
||||||
Encode the video at the given bit\-rate, expressed in bits/s. Unit suffixes are supported: '\fBK\fR' (x1000) and '\fBM\fR' (x1000000).
|
Encode the video at the given bit\-rate, expressed in bits/s. Unit suffixes are supported: '\fBK\fR' (x1000) and '\fBM\fR' (x1000000).
|
||||||
@@ -94,7 +98,7 @@ Also see \fB\-d\fR (\fB\-\-select\-usb\fR).
|
|||||||
|
|
||||||
.TP
|
.TP
|
||||||
.BI "\-\-encoder " name
|
.BI "\-\-encoder " name
|
||||||
Use a specific MediaCodec encoder (must be a H.264 encoder).
|
Use a specific MediaCodec encoder (depending on the codec provided by \fB\-\-codec\fR).
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-\-force\-adb\-forward
|
.B \-\-force\-adb\-forward
|
||||||
|
|||||||
@@ -57,10 +57,11 @@
|
|||||||
#define OPT_NO_CLEANUP 1037
|
#define OPT_NO_CLEANUP 1037
|
||||||
#define OPT_PRINT_FPS 1038
|
#define OPT_PRINT_FPS 1038
|
||||||
#define OPT_NO_POWER_ON 1039
|
#define OPT_NO_POWER_ON 1039
|
||||||
#define OPT_CODEC 1040
|
#define OPT_VIDEO_CODEC 1040
|
||||||
#define OPT_NO_AUDIO 1041
|
#define OPT_NO_AUDIO 1041
|
||||||
#define OPT_AUDIO_BIT_RATE 1042
|
#define OPT_AUDIO_BIT_RATE 1042
|
||||||
#define OPT_AUDIO_CODEC 1043
|
#define OPT_AUDIO_CODEC 1043
|
||||||
|
#define OPT_AUDIO_ENCODER_NAME 1044
|
||||||
|
|
||||||
struct sc_option {
|
struct sc_option {
|
||||||
char shortopt;
|
char shortopt;
|
||||||
@@ -116,6 +117,13 @@ static const struct sc_option options[] = {
|
|||||||
.text = "Select an audio codec (opus or aac).\n"
|
.text = "Select an audio codec (opus or aac).\n"
|
||||||
"Default is opus.",
|
"Default is opus.",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.longopt_id = OPT_AUDIO_ENCODER_NAME,
|
||||||
|
.longopt = "audio-encoder",
|
||||||
|
.argdesc = "name",
|
||||||
|
.text = "Use a specific MediaCodec audio encoder (depending on the "
|
||||||
|
"codec provided by --audio-codec).",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.shortopt = 'b',
|
.shortopt = 'b',
|
||||||
.longopt = "bit-rate",
|
.longopt = "bit-rate",
|
||||||
@@ -124,9 +132,10 @@ static const struct sc_option options[] = {
|
|||||||
"Unit suffixes are supported: 'K' (x1000) and 'M' (x1000000).\n"
|
"Unit suffixes are supported: 'K' (x1000) and 'M' (x1000000).\n"
|
||||||
"Default is 8M (8000000).",
|
"Default is 8M (8000000).",
|
||||||
},
|
},
|
||||||
|
// TODO keep OPT_CODEC to avoid partial matching with codec_options
|
||||||
{
|
{
|
||||||
.longopt_id = OPT_CODEC,
|
.longopt_id = OPT_VIDEO_CODEC,
|
||||||
.longopt = "codec",
|
.longopt = "video-codec",
|
||||||
.argdesc = "name",
|
.argdesc = "name",
|
||||||
.text = "Select a video codec (h264, h265 or av1).\n"
|
.text = "Select a video codec (h264, h265 or av1).\n"
|
||||||
"Default is h264.",
|
"Default is h264.",
|
||||||
@@ -191,7 +200,8 @@ static const struct sc_option options[] = {
|
|||||||
.longopt_id = OPT_ENCODER_NAME,
|
.longopt_id = OPT_ENCODER_NAME,
|
||||||
.longopt = "encoder",
|
.longopt = "encoder",
|
||||||
.argdesc = "name",
|
.argdesc = "name",
|
||||||
.text = "Use a specific MediaCodec encoder (must be a H.264 encoder).",
|
.text = "Use a specific MediaCodec encoder (depending on the codec "
|
||||||
|
"provided by --codec).",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.longopt_id = OPT_FORCE_ADB_FORWARD,
|
.longopt_id = OPT_FORCE_ADB_FORWARD,
|
||||||
@@ -1409,7 +1419,7 @@ guess_record_format(const char *filename) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
parse_codec(const char *optarg, enum sc_codec *codec) {
|
parse_video_codec(const char *optarg, enum sc_codec *codec) {
|
||||||
if (!strcmp(optarg, "h264")) {
|
if (!strcmp(optarg, "h264")) {
|
||||||
*codec = SC_CODEC_H264;
|
*codec = SC_CODEC_H264;
|
||||||
return true;
|
return true;
|
||||||
@@ -1422,7 +1432,7 @@ parse_codec(const char *optarg, enum sc_codec *codec) {
|
|||||||
*codec = SC_CODEC_AV1;
|
*codec = SC_CODEC_AV1;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
LOGE("Unsupported codec: %s (expected h264, h265 or av1)", optarg);
|
LOGE("Unsupported video codec: %s (expected h264, h265 or av1)", optarg);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1634,6 +1644,9 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[],
|
|||||||
case OPT_ENCODER_NAME:
|
case OPT_ENCODER_NAME:
|
||||||
opts->encoder_name = optarg;
|
opts->encoder_name = optarg;
|
||||||
break;
|
break;
|
||||||
|
case OPT_AUDIO_ENCODER_NAME:
|
||||||
|
opts->audio_encoder_name = optarg;
|
||||||
|
break;
|
||||||
case OPT_FORCE_ADB_FORWARD:
|
case OPT_FORCE_ADB_FORWARD:
|
||||||
opts->force_adb_forward = true;
|
opts->force_adb_forward = true;
|
||||||
break;
|
break;
|
||||||
@@ -1681,8 +1694,8 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[],
|
|||||||
case OPT_PRINT_FPS:
|
case OPT_PRINT_FPS:
|
||||||
opts->start_fps_counter = true;
|
opts->start_fps_counter = true;
|
||||||
break;
|
break;
|
||||||
case OPT_CODEC:
|
case OPT_VIDEO_CODEC:
|
||||||
if (!parse_codec(optarg, &opts->codec)) {
|
if (!parse_video_codec(optarg, &opts->video_codec)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -1799,13 +1812,6 @@ parse_args_with_getopt(struct scrcpy_cli_args *args, int argc, char *argv[],
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opts->record_format == SC_RECORD_FORMAT_MP4
|
|
||||||
&& opts->codec == SC_CODEC_AV1) {
|
|
||||||
LOGE("Could not mux AV1 stream into MP4 container "
|
|
||||||
"(record to mkv or select another video codec)");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!opts->control) {
|
if (!opts->control) {
|
||||||
if (opts->turn_screen_off) {
|
if (opts->turn_screen_off) {
|
||||||
LOGE("Could not request to turn screen off if control is disabled");
|
LOGE("Could not request to turn screen off if control is disabled");
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ const struct scrcpy_options scrcpy_options_default = {
|
|||||||
.v4l2_device = NULL,
|
.v4l2_device = NULL,
|
||||||
#endif
|
#endif
|
||||||
.log_level = SC_LOG_LEVEL_INFO,
|
.log_level = SC_LOG_LEVEL_INFO,
|
||||||
.codec = SC_CODEC_H264,
|
.video_codec = SC_CODEC_H264,
|
||||||
.audio_codec = SC_CODEC_OPUS,
|
.audio_codec = SC_CODEC_OPUS,
|
||||||
.record_format = SC_RECORD_FORMAT_AUTO,
|
.record_format = SC_RECORD_FORMAT_AUTO,
|
||||||
.keyboard_input_mode = SC_KEYBOARD_INPUT_MODE_INJECT,
|
.keyboard_input_mode = SC_KEYBOARD_INPUT_MODE_INJECT,
|
||||||
|
|||||||
@@ -97,11 +97,12 @@ struct scrcpy_options {
|
|||||||
const char *render_driver;
|
const char *render_driver;
|
||||||
const char *codec_options;
|
const char *codec_options;
|
||||||
const char *encoder_name;
|
const char *encoder_name;
|
||||||
|
const char *audio_encoder_name;
|
||||||
#ifdef HAVE_V4L2
|
#ifdef HAVE_V4L2
|
||||||
const char *v4l2_device;
|
const char *v4l2_device;
|
||||||
#endif
|
#endif
|
||||||
enum sc_log_level log_level;
|
enum sc_log_level log_level;
|
||||||
enum sc_codec codec;
|
enum sc_codec video_codec;
|
||||||
enum sc_codec audio_codec;
|
enum sc_codec audio_codec;
|
||||||
enum sc_record_format record_format;
|
enum sc_record_format record_format;
|
||||||
enum sc_keyboard_input_mode keyboard_input_mode;
|
enum sc_keyboard_input_mode keyboard_input_mode;
|
||||||
|
|||||||
@@ -630,7 +630,6 @@ sc_recorder_audio_packet_sink_close(struct sc_packet_sink *sink) {
|
|||||||
|
|
||||||
sc_mutex_lock(&recorder->mutex);
|
sc_mutex_lock(&recorder->mutex);
|
||||||
// EOS also stops the recorder
|
// EOS also stops the recorder
|
||||||
// TODO must stop only once both video and audio stream are complete
|
|
||||||
recorder->stopped = true;
|
recorder->stopped = true;
|
||||||
sc_cond_signal(&recorder->queue_cond);
|
sc_cond_signal(&recorder->queue_cond);
|
||||||
sc_mutex_unlock(&recorder->mutex);
|
sc_mutex_unlock(&recorder->mutex);
|
||||||
|
|||||||
@@ -350,7 +350,7 @@ scrcpy(struct scrcpy_options *options) {
|
|||||||
.select_usb = options->select_usb,
|
.select_usb = options->select_usb,
|
||||||
.select_tcpip = options->select_tcpip,
|
.select_tcpip = options->select_tcpip,
|
||||||
.log_level = options->log_level,
|
.log_level = options->log_level,
|
||||||
.codec = options->codec,
|
.video_codec = options->video_codec,
|
||||||
.audio_codec = options->audio_codec,
|
.audio_codec = options->audio_codec,
|
||||||
.crop = options->crop,
|
.crop = options->crop,
|
||||||
.port_range = options->port_range,
|
.port_range = options->port_range,
|
||||||
@@ -368,6 +368,7 @@ scrcpy(struct scrcpy_options *options) {
|
|||||||
.stay_awake = options->stay_awake,
|
.stay_awake = options->stay_awake,
|
||||||
.codec_options = options->codec_options,
|
.codec_options = options->codec_options,
|
||||||
.encoder_name = options->encoder_name,
|
.encoder_name = options->encoder_name,
|
||||||
|
.audio_encoder_name = options->audio_encoder_name,
|
||||||
.force_adb_forward = options->force_adb_forward,
|
.force_adb_forward = options->force_adb_forward,
|
||||||
.power_off_on_close = options->power_off_on_close,
|
.power_off_on_close = options->power_off_on_close,
|
||||||
.clipboard_autosync = options->clipboard_autosync,
|
.clipboard_autosync = options->clipboard_autosync,
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ sc_server_params_destroy(struct sc_server_params *params) {
|
|||||||
free((char *) params->crop);
|
free((char *) params->crop);
|
||||||
free((char *) params->codec_options);
|
free((char *) params->codec_options);
|
||||||
free((char *) params->encoder_name);
|
free((char *) params->encoder_name);
|
||||||
|
free((char *) params->audio_encoder_name);
|
||||||
free((char *) params->tcpip_dst);
|
free((char *) params->tcpip_dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,6 +98,7 @@ sc_server_params_copy(struct sc_server_params *dst,
|
|||||||
COPY(crop);
|
COPY(crop);
|
||||||
COPY(codec_options);
|
COPY(codec_options);
|
||||||
COPY(encoder_name);
|
COPY(encoder_name);
|
||||||
|
COPY(audio_encoder_name);
|
||||||
COPY(tcpip_dst);
|
COPY(tcpip_dst);
|
||||||
#undef COPY
|
#undef COPY
|
||||||
|
|
||||||
@@ -228,8 +230,9 @@ execute_server(struct sc_server *server,
|
|||||||
} else if (params->audio_bit_rate) {
|
} else if (params->audio_bit_rate) {
|
||||||
ADD_PARAM("audio_bit_rate=%" PRIu32, params->audio_bit_rate);
|
ADD_PARAM("audio_bit_rate=%" PRIu32, params->audio_bit_rate);
|
||||||
}
|
}
|
||||||
if (params->codec != SC_CODEC_H264) {
|
if (params->video_codec != SC_CODEC_H264) {
|
||||||
ADD_PARAM("codec=%s", sc_server_get_codec_name(params->codec));
|
ADD_PARAM("video_codec=%s",
|
||||||
|
sc_server_get_codec_name(params->video_codec));
|
||||||
}
|
}
|
||||||
if (params->audio_codec != SC_CODEC_OPUS) {
|
if (params->audio_codec != SC_CODEC_OPUS) {
|
||||||
ADD_PARAM("audio_codec=%s",
|
ADD_PARAM("audio_codec=%s",
|
||||||
@@ -270,6 +273,9 @@ execute_server(struct sc_server *server,
|
|||||||
if (params->encoder_name) {
|
if (params->encoder_name) {
|
||||||
ADD_PARAM("encoder_name=%s", params->encoder_name);
|
ADD_PARAM("encoder_name=%s", params->encoder_name);
|
||||||
}
|
}
|
||||||
|
if (params->audio_encoder_name) {
|
||||||
|
ADD_PARAM("audio_encoder_name=%s", params->audio_encoder_name);
|
||||||
|
}
|
||||||
if (params->power_off_on_close) {
|
if (params->power_off_on_close) {
|
||||||
ADD_PARAM("power_off_on_close=true");
|
ADD_PARAM("power_off_on_close=true");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,11 +25,12 @@ struct sc_server_params {
|
|||||||
uint32_t scid;
|
uint32_t scid;
|
||||||
const char *req_serial;
|
const char *req_serial;
|
||||||
enum sc_log_level log_level;
|
enum sc_log_level log_level;
|
||||||
enum sc_codec codec;
|
enum sc_codec video_codec;
|
||||||
enum sc_codec audio_codec;
|
enum sc_codec audio_codec;
|
||||||
const char *crop;
|
const char *crop;
|
||||||
const char *codec_options;
|
const char *codec_options;
|
||||||
const char *encoder_name;
|
const char *encoder_name;
|
||||||
|
const char *audio_encoder_name;
|
||||||
struct sc_port_range port_range;
|
struct sc_port_range port_range;
|
||||||
uint32_t tunnel_host;
|
uint32_t tunnel_host;
|
||||||
uint16_t tunnel_port;
|
uint16_t tunnel_port;
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import android.media.MediaRecorder;
|
|||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.HandlerThread;
|
import android.os.HandlerThread;
|
||||||
|
import android.os.Looper;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
@@ -20,7 +21,7 @@ import java.util.concurrent.BlockingQueue;
|
|||||||
public final class AudioEncoder {
|
public final class AudioEncoder {
|
||||||
|
|
||||||
private static class InputTask {
|
private static class InputTask {
|
||||||
final int index;
|
private final int index;
|
||||||
|
|
||||||
InputTask(int index) {
|
InputTask(int index) {
|
||||||
this.index = index;
|
this.index = index;
|
||||||
@@ -28,8 +29,8 @@ public final class AudioEncoder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static class OutputTask {
|
private static class OutputTask {
|
||||||
final int index;
|
private final int index;
|
||||||
final MediaCodec.BufferInfo bufferInfo;
|
private final MediaCodec.BufferInfo bufferInfo;
|
||||||
|
|
||||||
OutputTask(int index, MediaCodec.BufferInfo bufferInfo) {
|
OutputTask(int index, MediaCodec.BufferInfo bufferInfo) {
|
||||||
this.index = index;
|
this.index = index;
|
||||||
@@ -45,9 +46,7 @@ public final class AudioEncoder {
|
|||||||
|
|
||||||
private final Streamer streamer;
|
private final Streamer streamer;
|
||||||
private final int bitRate;
|
private final int bitRate;
|
||||||
|
private final String encoderName;
|
||||||
private AudioRecord recorder;
|
|
||||||
private MediaCodec mediaCodec;
|
|
||||||
|
|
||||||
// Capacity of 64 is in practice "infinite" (it is limited by the number of available MediaCodec buffers, typically 4).
|
// Capacity of 64 is in practice "infinite" (it is limited by the number of available MediaCodec buffers, typically 4).
|
||||||
// So many pending tasks would lead to an unacceptable delay anyway.
|
// So many pending tasks would lead to an unacceptable delay anyway.
|
||||||
@@ -62,9 +61,10 @@ public final class AudioEncoder {
|
|||||||
|
|
||||||
private boolean ended;
|
private boolean ended;
|
||||||
|
|
||||||
public AudioEncoder(Streamer streamer, int bitRate) {
|
public AudioEncoder(Streamer streamer, int bitRate, String encoderName) {
|
||||||
this.streamer = streamer;
|
this.streamer = streamer;
|
||||||
this.bitRate = bitRate;
|
this.bitRate = bitRate;
|
||||||
|
this.encoderName = encoderName;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static AudioFormat createAudioFormat() {
|
private static AudioFormat createAudioFormat() {
|
||||||
@@ -99,7 +99,7 @@ public final class AudioEncoder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.N)
|
@TargetApi(Build.VERSION_CODES.N)
|
||||||
private void inputThread() throws IOException, InterruptedException {
|
private void inputThread(MediaCodec mediaCodec, AudioRecord recorder) throws IOException, InterruptedException {
|
||||||
final AudioTimestamp timestamp = new AudioTimestamp();
|
final AudioTimestamp timestamp = new AudioTimestamp();
|
||||||
long previousPts = 0;
|
long previousPts = 0;
|
||||||
long nextPts = 0;
|
long nextPts = 0;
|
||||||
@@ -143,7 +143,7 @@ public final class AudioEncoder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void outputThread() throws IOException, InterruptedException {
|
private void outputThread(MediaCodec mediaCodec) throws IOException, InterruptedException {
|
||||||
streamer.writeHeader();
|
streamer.writeHeader();
|
||||||
|
|
||||||
while (!Thread.currentThread().isInterrupted()) {
|
while (!Thread.currentThread().isInterrupted()) {
|
||||||
@@ -200,30 +200,37 @@ public final class AudioEncoder {
|
|||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.M)
|
@TargetApi(Build.VERSION_CODES.M)
|
||||||
public void encode() throws IOException {
|
public void encode() throws IOException {
|
||||||
try {
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
|
||||||
try {
|
Ln.w("Audio disabled: it is not supported before Android 11");
|
||||||
String mimeType = streamer.getCodec().getMimeType();
|
streamer.writeDisableStream();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mediaCodec = MediaCodec.createEncoderByType(mimeType); // may throw IOException
|
MediaCodec mediaCodec = null;
|
||||||
|
AudioRecord recorder = null;
|
||||||
|
|
||||||
|
boolean mediaCodecStarted = false;
|
||||||
|
boolean recorderStarted = false;
|
||||||
|
try {
|
||||||
|
Codec codec = streamer.getCodec();
|
||||||
|
mediaCodec = createMediaCodec(codec, encoderName);
|
||||||
recorder = createAudioRecord();
|
recorder = createAudioRecord();
|
||||||
|
|
||||||
mediaCodecThread = new HandlerThread("AudioEncoder");
|
mediaCodecThread = new HandlerThread("AudioEncoder");
|
||||||
mediaCodecThread.start();
|
mediaCodecThread.start();
|
||||||
|
|
||||||
MediaFormat format = createFormat(mimeType, bitRate);
|
MediaFormat format = createFormat(codec.getMimeType(), bitRate);
|
||||||
mediaCodec.setCallback(new EncoderCallback(), new Handler(mediaCodecThread.getLooper()));
|
mediaCodec.setCallback(new EncoderCallback(), new Handler(mediaCodecThread.getLooper()));
|
||||||
mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
|
mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
|
||||||
|
|
||||||
recorder.startRecording();
|
recorder.startRecording();
|
||||||
} catch (Throwable e) {
|
recorderStarted = true;
|
||||||
// Notify the client that the audio could not be captured
|
|
||||||
streamer.writeDisableStream();
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
final MediaCodec mediaCodecRef = mediaCodec;
|
||||||
|
final AudioRecord recorderRef = recorder;
|
||||||
inputThread = new Thread(() -> {
|
inputThread = new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
inputThread();
|
inputThread(mediaCodecRef, recorderRef);
|
||||||
} catch (IOException | InterruptedException e) {
|
} catch (IOException | InterruptedException e) {
|
||||||
Ln.e("Audio capture error", e);
|
Ln.e("Audio capture error", e);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -233,7 +240,7 @@ public final class AudioEncoder {
|
|||||||
|
|
||||||
outputThread = new Thread(() -> {
|
outputThread = new Thread(() -> {
|
||||||
try {
|
try {
|
||||||
outputThread();
|
outputThread(mediaCodecRef);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
// this is expected on close
|
// this is expected on close
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -247,44 +254,77 @@ public final class AudioEncoder {
|
|||||||
});
|
});
|
||||||
|
|
||||||
mediaCodec.start();
|
mediaCodec.start();
|
||||||
|
mediaCodecStarted = true;
|
||||||
inputThread.start();
|
inputThread.start();
|
||||||
outputThread.start();
|
outputThread.start();
|
||||||
} catch (Throwable e) {
|
|
||||||
if (mediaCodec != null) {
|
|
||||||
mediaCodec.release();
|
|
||||||
}
|
|
||||||
if (recorder != null) {
|
|
||||||
recorder.release();
|
|
||||||
}
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
waitEnded();
|
waitEnded();
|
||||||
|
} catch (ConfigurationException e) {
|
||||||
|
// Do not print stack trace, a user-friendly error-message has already been logged
|
||||||
} finally {
|
} finally {
|
||||||
cleanUp();
|
if (!recorderStarted) {
|
||||||
}
|
// Notify the client that the audio could not be captured
|
||||||
|
streamer.writeDisableStream();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cleanUp() {
|
// Cleanup everything (either at the end or on error at any step of the initialization)
|
||||||
mediaCodecThread.getLooper().quit();
|
if (mediaCodecThread != null) {
|
||||||
|
Looper looper = mediaCodecThread.getLooper();
|
||||||
|
if (looper != null) {
|
||||||
|
looper.quitSafely();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (inputThread != null) {
|
||||||
inputThread.interrupt();
|
inputThread.interrupt();
|
||||||
|
}
|
||||||
|
if (outputThread != null) {
|
||||||
outputThread.interrupt();
|
outputThread.interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
if (mediaCodecThread != null) {
|
||||||
mediaCodecThread.join();
|
mediaCodecThread.join();
|
||||||
|
}
|
||||||
|
if (inputThread != null) {
|
||||||
inputThread.join();
|
inputThread.join();
|
||||||
|
}
|
||||||
|
if (outputThread != null) {
|
||||||
outputThread.join();
|
outputThread.join();
|
||||||
|
}
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
// Should never happen
|
// Should never happen
|
||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mediaCodec != null) {
|
||||||
|
if (mediaCodecStarted) {
|
||||||
mediaCodec.stop();
|
mediaCodec.stop();
|
||||||
|
}
|
||||||
mediaCodec.release();
|
mediaCodec.release();
|
||||||
|
}
|
||||||
|
if (recorder != null) {
|
||||||
|
if (recorderStarted) {
|
||||||
recorder.stop();
|
recorder.stop();
|
||||||
|
}
|
||||||
recorder.release();
|
recorder.release();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MediaCodec createMediaCodec(Codec codec, String encoderName) throws IOException, ConfigurationException {
|
||||||
|
if (encoderName != null) {
|
||||||
|
Ln.d("Creating audio encoder by name: '" + encoderName + "'");
|
||||||
|
try {
|
||||||
|
return MediaCodec.createByCodecName(encoderName);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
Ln.e(CodecUtils.buildUnknownEncoderMessage(codec, encoderName));
|
||||||
|
throw new ConfigurationException("Unknown encoder: " + encoderName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MediaCodec mediaCodec = MediaCodec.createEncoderByType(codec.getMimeType());
|
||||||
|
Ln.d("Using audio encoder: '" + mediaCodec.getName() + "'");
|
||||||
|
return mediaCodec;
|
||||||
|
}
|
||||||
|
|
||||||
private class EncoderCallback extends MediaCodec.Callback {
|
private class EncoderCallback extends MediaCodec.Callback {
|
||||||
@TargetApi(Build.VERSION_CODES.N)
|
@TargetApi(Build.VERSION_CODES.N)
|
||||||
|
|||||||
@@ -2,7 +2,10 @@ package com.genymobile.scrcpy;
|
|||||||
|
|
||||||
public interface Codec {
|
public interface Codec {
|
||||||
|
|
||||||
enum Type {VIDEO, AUDIO}
|
enum Type {
|
||||||
|
VIDEO,
|
||||||
|
AUDIO,
|
||||||
|
}
|
||||||
|
|
||||||
Type getType();
|
Type getType();
|
||||||
|
|
||||||
|
|||||||
40
server/src/main/java/com/genymobile/scrcpy/CodecUtils.java
Normal file
40
server/src/main/java/com/genymobile/scrcpy/CodecUtils.java
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package com.genymobile.scrcpy;
|
||||||
|
|
||||||
|
import android.media.MediaCodecInfo;
|
||||||
|
import android.media.MediaCodecList;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public final class CodecUtils {
|
||||||
|
|
||||||
|
private CodecUtils() {
|
||||||
|
// not instantiable
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String buildUnknownEncoderMessage(Codec codec, String encoderName) {
|
||||||
|
StringBuilder msg = new StringBuilder("Encoder '").append(encoderName).append("' for ").append(codec.getName()).append(" not found");
|
||||||
|
MediaCodecInfo[] encoders = listEncoders(codec.getMimeType());
|
||||||
|
if (encoders != null && encoders.length > 0) {
|
||||||
|
msg.append("\nTry to use one of the available encoders:");
|
||||||
|
String codecOption = codec.getType() == Codec.Type.VIDEO ? "video-codec" : "audio-codec";
|
||||||
|
for (MediaCodecInfo encoder : encoders) {
|
||||||
|
msg.append("\n scrcpy --").append(codecOption).append("=").append(codec.getName());
|
||||||
|
msg.append(" --encoder='").append(encoder.getName()).append("'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msg.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MediaCodecInfo[] listEncoders(String mimeType) {
|
||||||
|
List<MediaCodecInfo> result = new ArrayList<>();
|
||||||
|
MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
|
||||||
|
for (MediaCodecInfo codecInfo : list.getCodecInfos()) {
|
||||||
|
if (codecInfo.isEncoder() && Arrays.asList(codecInfo.getSupportedTypes()).contains(mimeType)) {
|
||||||
|
result.add(codecInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toArray(new MediaCodecInfo[result.size()]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.genymobile.scrcpy;
|
||||||
|
|
||||||
|
public class ConfigurationException extends Exception {
|
||||||
|
public ConfigurationException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -61,12 +61,12 @@ public final class Device {
|
|||||||
|
|
||||||
private final boolean supportsInputEvents;
|
private final boolean supportsInputEvents;
|
||||||
|
|
||||||
public Device(Options options) {
|
public Device(Options options) throws ConfigurationException {
|
||||||
displayId = options.getDisplayId();
|
displayId = options.getDisplayId();
|
||||||
DisplayInfo displayInfo = ServiceManager.getDisplayManager().getDisplayInfo(displayId);
|
DisplayInfo displayInfo = ServiceManager.getDisplayManager().getDisplayInfo(displayId);
|
||||||
if (displayInfo == null) {
|
if (displayInfo == null) {
|
||||||
int[] displayIds = ServiceManager.getDisplayManager().getDisplayIds();
|
Ln.e(buildUnknownDisplayIdMessage(displayId));
|
||||||
throw new InvalidDisplayIdException(displayId, displayIds);
|
throw new ConfigurationException("Unknown display id: " + displayId);
|
||||||
}
|
}
|
||||||
|
|
||||||
int displayInfoFlags = displayInfo.getFlags();
|
int displayInfoFlags = displayInfo.getFlags();
|
||||||
@@ -130,6 +130,18 @@ public final class Device {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String buildUnknownDisplayIdMessage(int displayId) {
|
||||||
|
StringBuilder msg = new StringBuilder("Display ").append(displayId).append(" not found");
|
||||||
|
int[] displayIds = ServiceManager.getDisplayManager().getDisplayIds();
|
||||||
|
if (displayIds != null && displayIds.length > 0) {
|
||||||
|
msg.append("\nTry to use one of the available display ids:");
|
||||||
|
for (int id : displayIds) {
|
||||||
|
msg.append("\n scrcpy --display=").append(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msg.toString();
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized void setMaxSize(int newMaxSize) {
|
public synchronized void setMaxSize(int newMaxSize) {
|
||||||
maxSize = newMaxSize;
|
maxSize = newMaxSize;
|
||||||
screenInfo = ScreenInfo.computeScreenInfo(screenInfo.getReverseVideoRotation(), deviceSize, crop, newMaxSize, lockVideoOrientation);
|
screenInfo = ScreenInfo.computeScreenInfo(screenInfo.getReverseVideoRotation(), deviceSize, crop, newMaxSize, lockVideoOrientation);
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
package com.genymobile.scrcpy;
|
|
||||||
|
|
||||||
public class InvalidDisplayIdException extends RuntimeException {
|
|
||||||
|
|
||||||
private final int displayId;
|
|
||||||
private final int[] availableDisplayIds;
|
|
||||||
|
|
||||||
public InvalidDisplayIdException(int displayId, int[] availableDisplayIds) {
|
|
||||||
super("There is no display having id " + displayId);
|
|
||||||
this.displayId = displayId;
|
|
||||||
this.availableDisplayIds = availableDisplayIds;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDisplayId() {
|
|
||||||
return displayId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int[] getAvailableDisplayIds() {
|
|
||||||
return availableDisplayIds;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
package com.genymobile.scrcpy;
|
|
||||||
|
|
||||||
import android.media.MediaCodecInfo;
|
|
||||||
|
|
||||||
public class InvalidEncoderException extends RuntimeException {
|
|
||||||
|
|
||||||
private final String name;
|
|
||||||
private final MediaCodecInfo[] availableEncoders;
|
|
||||||
|
|
||||||
public InvalidEncoderException(String name, MediaCodecInfo[] availableEncoders) {
|
|
||||||
super("There is no encoder having name '" + name + '"');
|
|
||||||
this.name = name;
|
|
||||||
this.availableEncoders = availableEncoders;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MediaCodecInfo[] getAvailableEncoders() {
|
|
||||||
return availableEncoders;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,7 @@ public class Options {
|
|||||||
private int scid = -1; // 31-bit non-negative value, or -1
|
private int scid = -1; // 31-bit non-negative value, or -1
|
||||||
private boolean audio = true;
|
private boolean audio = true;
|
||||||
private int maxSize;
|
private int maxSize;
|
||||||
private VideoCodec codec = VideoCodec.H264;
|
private VideoCodec videoCodec = VideoCodec.H264;
|
||||||
private AudioCodec audioCodec = AudioCodec.OPUS;
|
private AudioCodec audioCodec = AudioCodec.OPUS;
|
||||||
private int bitRate = 8000000;
|
private int bitRate = 8000000;
|
||||||
private int audioBitRate = 196000;
|
private int audioBitRate = 196000;
|
||||||
@@ -24,6 +24,7 @@ public class Options {
|
|||||||
private boolean stayAwake;
|
private boolean stayAwake;
|
||||||
private List<CodecOption> codecOptions;
|
private List<CodecOption> codecOptions;
|
||||||
private String encoderName;
|
private String encoderName;
|
||||||
|
private String audioEncoderName;
|
||||||
private boolean powerOffScreenOnClose;
|
private boolean powerOffScreenOnClose;
|
||||||
private boolean clipboardAutosync = true;
|
private boolean clipboardAutosync = true;
|
||||||
private boolean downsizeOnError = true;
|
private boolean downsizeOnError = true;
|
||||||
@@ -68,12 +69,12 @@ public class Options {
|
|||||||
this.maxSize = maxSize;
|
this.maxSize = maxSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VideoCodec getCodec() {
|
public VideoCodec getVideoCodec() {
|
||||||
return codec;
|
return videoCodec;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCodec(VideoCodec codec) {
|
public void setVideoCodec(VideoCodec videoCodec) {
|
||||||
this.codec = codec;
|
this.videoCodec = videoCodec;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AudioCodec getAudioCodec() {
|
public AudioCodec getAudioCodec() {
|
||||||
@@ -180,6 +181,14 @@ public class Options {
|
|||||||
this.encoderName = encoderName;
|
this.encoderName = encoderName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getAudioEncoderName() {
|
||||||
|
return audioEncoderName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAudioEncoderName(String audioEncoderName) {
|
||||||
|
this.audioEncoderName = audioEncoderName;
|
||||||
|
}
|
||||||
|
|
||||||
public void setPowerOffScreenOnClose(boolean powerOffScreenOnClose) {
|
public void setPowerOffScreenOnClose(boolean powerOffScreenOnClose) {
|
||||||
this.powerOffScreenOnClose = powerOffScreenOnClose;
|
this.powerOffScreenOnClose = powerOffScreenOnClose;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import com.genymobile.scrcpy.wrappers.SurfaceControl;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.media.MediaCodec;
|
import android.media.MediaCodec;
|
||||||
import android.media.MediaCodecInfo;
|
import android.media.MediaCodecInfo;
|
||||||
import android.media.MediaCodecList;
|
|
||||||
import android.media.MediaFormat;
|
import android.media.MediaFormat;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
@@ -14,8 +13,6 @@ import android.view.Surface;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
@@ -62,10 +59,10 @@ public class ScreenEncoder implements Device.RotationListener {
|
|||||||
return rotationChanged.getAndSet(false);
|
return rotationChanged.getAndSet(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void streamScreen() throws IOException {
|
public void streamScreen() throws IOException, ConfigurationException {
|
||||||
String videoMimeType = streamer.getCodec().getMimeType();
|
Codec codec = streamer.getCodec();
|
||||||
MediaCodec codec = createCodec(videoMimeType, encoderName);
|
MediaCodec mediaCodec = createMediaCodec(codec, encoderName);
|
||||||
MediaFormat format = createFormat(videoMimeType, bitRate, maxFps, codecOptions);
|
MediaFormat format = createFormat(codec.getMimeType(), bitRate, maxFps, codecOptions);
|
||||||
IBinder display = createDisplay();
|
IBinder display = createDisplay();
|
||||||
device.setRotationListener(this);
|
device.setRotationListener(this);
|
||||||
|
|
||||||
@@ -84,8 +81,8 @@ public class ScreenEncoder implements Device.RotationListener {
|
|||||||
|
|
||||||
Surface surface = null;
|
Surface surface = null;
|
||||||
try {
|
try {
|
||||||
codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
|
mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
|
||||||
surface = codec.createInputSurface();
|
surface = mediaCodec.createInputSurface();
|
||||||
|
|
||||||
// does not include the locked video orientation
|
// does not include the locked video orientation
|
||||||
Rect unlockedVideoRect = screenInfo.getUnlockedVideoSize().toRect();
|
Rect unlockedVideoRect = screenInfo.getUnlockedVideoSize().toRect();
|
||||||
@@ -93,11 +90,11 @@ public class ScreenEncoder implements Device.RotationListener {
|
|||||||
int layerStack = device.getLayerStack();
|
int layerStack = device.getLayerStack();
|
||||||
setDisplaySurface(display, surface, videoRotation, contentRect, unlockedVideoRect, layerStack);
|
setDisplaySurface(display, surface, videoRotation, contentRect, unlockedVideoRect, layerStack);
|
||||||
|
|
||||||
codec.start();
|
mediaCodec.start();
|
||||||
|
|
||||||
alive = encode(codec, streamer);
|
alive = encode(mediaCodec, streamer);
|
||||||
// do not call stop() on exception, it would trigger an IllegalStateException
|
// do not call stop() on exception, it would trigger an IllegalStateException
|
||||||
codec.stop();
|
mediaCodec.stop();
|
||||||
} catch (IllegalStateException | IllegalArgumentException e) {
|
} catch (IllegalStateException | IllegalArgumentException e) {
|
||||||
Ln.e("Encoding error: " + e.getClass().getName() + ": " + e.getMessage());
|
Ln.e("Encoding error: " + e.getClass().getName() + ": " + e.getMessage());
|
||||||
if (!prepareRetry(device, screenInfo)) {
|
if (!prepareRetry(device, screenInfo)) {
|
||||||
@@ -106,14 +103,14 @@ public class ScreenEncoder implements Device.RotationListener {
|
|||||||
Ln.i("Retrying...");
|
Ln.i("Retrying...");
|
||||||
alive = true;
|
alive = true;
|
||||||
} finally {
|
} finally {
|
||||||
codec.reset();
|
mediaCodec.reset();
|
||||||
if (surface != null) {
|
if (surface != null) {
|
||||||
surface.release();
|
surface.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (alive);
|
} while (alive);
|
||||||
} finally {
|
} finally {
|
||||||
codec.release();
|
mediaCodec.release();
|
||||||
device.setRotationListener(null);
|
device.setRotationListener(null);
|
||||||
SurfaceControl.destroyDisplay(display);
|
SurfaceControl.destroyDisplay(display);
|
||||||
}
|
}
|
||||||
@@ -199,30 +196,19 @@ public class ScreenEncoder implements Device.RotationListener {
|
|||||||
return !eof;
|
return !eof;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static MediaCodecInfo[] listEncoders(String videoMimeType) {
|
private static MediaCodec createMediaCodec(Codec codec, String encoderName) throws IOException, ConfigurationException {
|
||||||
List<MediaCodecInfo> result = new ArrayList<>();
|
|
||||||
MediaCodecList list = new MediaCodecList(MediaCodecList.REGULAR_CODECS);
|
|
||||||
for (MediaCodecInfo codecInfo : list.getCodecInfos()) {
|
|
||||||
if (codecInfo.isEncoder() && Arrays.asList(codecInfo.getSupportedTypes()).contains(videoMimeType)) {
|
|
||||||
result.add(codecInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result.toArray(new MediaCodecInfo[result.size()]);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static MediaCodec createCodec(String videoMimeType, String encoderName) throws IOException {
|
|
||||||
if (encoderName != null) {
|
if (encoderName != null) {
|
||||||
Ln.d("Creating encoder by name: '" + encoderName + "'");
|
Ln.d("Creating encoder by name: '" + encoderName + "'");
|
||||||
try {
|
try {
|
||||||
return MediaCodec.createByCodecName(encoderName);
|
return MediaCodec.createByCodecName(encoderName);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
MediaCodecInfo[] encoders = listEncoders(videoMimeType);
|
Ln.e(CodecUtils.buildUnknownEncoderMessage(codec, encoderName));
|
||||||
throw new InvalidEncoderException(encoderName, encoders);
|
throw new ConfigurationException("Unknown encoder: " + encoderName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MediaCodec codec = MediaCodec.createEncoderByType(videoMimeType);
|
MediaCodec mediaCodec = MediaCodec.createEncoderByType(codec.getMimeType());
|
||||||
Ln.d("Using encoder: '" + codec.getName() + "'");
|
Ln.d("Using encoder: '" + mediaCodec.getName() + "'");
|
||||||
return codec;
|
return mediaCodec;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setCodecOption(MediaFormat format, CodecOption codecOption) {
|
private static void setCodecOption(MediaFormat format, CodecOption codecOption) {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.genymobile.scrcpy;
|
package com.genymobile.scrcpy;
|
||||||
|
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.media.MediaCodecInfo;
|
|
||||||
import android.os.BatteryManager;
|
import android.os.BatteryManager;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
|
||||||
@@ -59,7 +58,7 @@ public final class Server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void scrcpy(Options options) throws IOException {
|
private static void scrcpy(Options options) throws IOException, ConfigurationException {
|
||||||
Ln.i("Device: " + Build.MANUFACTURER + " " + Build.MODEL + " (Android " + Build.VERSION.RELEASE + ")");
|
Ln.i("Device: " + Build.MANUFACTURER + " " + Build.MODEL + " (Android " + Build.VERSION.RELEASE + ")");
|
||||||
final Device device = new Device(options);
|
final Device device = new Device(options);
|
||||||
List<CodecOption> codecOptions = options.getCodecOptions();
|
List<CodecOption> codecOptions = options.getCodecOptions();
|
||||||
@@ -93,14 +92,15 @@ public final class Server {
|
|||||||
Workarounds.fillAppInfo();
|
Workarounds.fillAppInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Controller controller = null;
|
||||||
|
AudioEncoder audioEncoder = null;
|
||||||
|
|
||||||
try (DesktopConnection connection = DesktopConnection.open(scid, tunnelForward, audio, control, sendDummyByte)) {
|
try (DesktopConnection connection = DesktopConnection.open(scid, tunnelForward, audio, control, sendDummyByte)) {
|
||||||
VideoCodec codec = options.getCodec();
|
|
||||||
if (options.getSendDeviceMeta()) {
|
if (options.getSendDeviceMeta()) {
|
||||||
Size videoSize = device.getScreenInfo().getVideoSize();
|
Size videoSize = device.getScreenInfo().getVideoSize();
|
||||||
connection.sendDeviceMeta(Device.getDeviceName(), videoSize.getWidth(), videoSize.getHeight());
|
connection.sendDeviceMeta(Device.getDeviceName(), videoSize.getWidth(), videoSize.getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
Controller controller = null;
|
|
||||||
if (control) {
|
if (control) {
|
||||||
controller = new Controller(device, connection, options.getClipboardAutosync(), options.getPowerOn());
|
controller = new Controller(device, connection, options.getClipboardAutosync(), options.getPowerOn());
|
||||||
controller.start();
|
controller.start();
|
||||||
@@ -109,17 +109,17 @@ public final class Server {
|
|||||||
device.setClipboardListener(text -> controllerRef.getSender().pushClipboardText(text));
|
device.setClipboardListener(text -> controllerRef.getSender().pushClipboardText(text));
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioEncoder audioEncoder = null;
|
|
||||||
if (audio) {
|
if (audio) {
|
||||||
Streamer audioStreamer = new Streamer(connection.getAudioFd(), options.getAudioCodec(), options.getSendCodecId(),
|
Streamer audioStreamer = new Streamer(connection.getAudioFd(), options.getAudioCodec(), options.getSendCodecId(),
|
||||||
options.getSendFrameMeta());
|
options.getSendFrameMeta());
|
||||||
audioEncoder = new AudioEncoder(audioStreamer, options.getAudioBitRate());
|
audioEncoder = new AudioEncoder(audioStreamer, options.getAudioBitRate(), options.getAudioEncoderName());
|
||||||
audioEncoder.start();
|
audioEncoder.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
Streamer videoStreamer = new Streamer(connection.getVideoFd(), codec, options.getSendCodecId(), options.getSendFrameMeta());
|
Streamer videoStreamer = new Streamer(connection.getVideoFd(), options.getVideoCodec(), options.getSendCodecId(),
|
||||||
ScreenEncoder screenEncoder = new ScreenEncoder(device, videoStreamer, options.getBitRate(), options.getMaxFps(),
|
options.getSendFrameMeta());
|
||||||
codecOptions, options.getEncoderName(), options.getDownsizeOnError());
|
ScreenEncoder screenEncoder = new ScreenEncoder(device, videoStreamer, options.getBitRate(), options.getMaxFps(), codecOptions,
|
||||||
|
options.getEncoderName(), options.getDownsizeOnError());
|
||||||
try {
|
try {
|
||||||
// synchronous
|
// synchronous
|
||||||
screenEncoder.streamScreen();
|
screenEncoder.streamScreen();
|
||||||
@@ -128,6 +128,7 @@ public final class Server {
|
|||||||
if (!IO.isBrokenPipe(e)) {
|
if (!IO.isBrokenPipe(e)) {
|
||||||
Ln.e("Video encoding error", e);
|
Ln.e("Video encoding error", e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} finally {
|
} finally {
|
||||||
Ln.d("Screen streaming stopped");
|
Ln.d("Screen streaming stopped");
|
||||||
initThread.interrupt();
|
initThread.interrupt();
|
||||||
@@ -151,7 +152,6 @@ public final class Server {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static Thread startInitThread(final Options options) {
|
private static Thread startInitThread(final Options options) {
|
||||||
Thread thread = new Thread(() -> initAndCleanUp(options));
|
Thread thread = new Thread(() -> initAndCleanUp(options));
|
||||||
@@ -159,6 +159,7 @@ public final class Server {
|
|||||||
return thread;
|
return thread;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("MethodLength")
|
||||||
private static Options createOptions(String... args) {
|
private static Options createOptions(String... args) {
|
||||||
if (args.length < 1) {
|
if (args.length < 1) {
|
||||||
throw new IllegalArgumentException("Missing client version");
|
throw new IllegalArgumentException("Missing client version");
|
||||||
@@ -196,12 +197,12 @@ public final class Server {
|
|||||||
boolean audio = Boolean.parseBoolean(value);
|
boolean audio = Boolean.parseBoolean(value);
|
||||||
options.setAudio(audio);
|
options.setAudio(audio);
|
||||||
break;
|
break;
|
||||||
case "codec":
|
case "video_codec":
|
||||||
VideoCodec codec = VideoCodec.findByName(value);
|
VideoCodec videoCodec = VideoCodec.findByName(value);
|
||||||
if (codec == null) {
|
if (videoCodec == null) {
|
||||||
throw new IllegalArgumentException("Video codec " + value + " not supported");
|
throw new IllegalArgumentException("Video codec " + value + " not supported");
|
||||||
}
|
}
|
||||||
options.setCodec(codec);
|
options.setVideoCodec(videoCodec);
|
||||||
break;
|
break;
|
||||||
case "audio_codec":
|
case "audio_codec":
|
||||||
AudioCodec audioCodec = AudioCodec.findByName(value);
|
AudioCodec audioCodec = AudioCodec.findByName(value);
|
||||||
@@ -263,6 +264,10 @@ public final class Server {
|
|||||||
options.setEncoderName(value);
|
options.setEncoderName(value);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case "audio_encoder_name":
|
||||||
|
if (!value.isEmpty()) {
|
||||||
|
options.setAudioEncoderName(value);
|
||||||
|
}
|
||||||
case "power_off_on_close":
|
case "power_off_on_close":
|
||||||
boolean powerOffScreenOnClose = Boolean.parseBoolean(value);
|
boolean powerOffScreenOnClose = Boolean.parseBoolean(value);
|
||||||
options.setPowerOffScreenOnClose(powerOffScreenOnClose);
|
options.setPowerOffScreenOnClose(powerOffScreenOnClose);
|
||||||
@@ -333,38 +338,19 @@ public final class Server {
|
|||||||
return new Rect(x, y, x + width, y + height);
|
return new Rect(x, y, x + width, y + height);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void suggestFix(Throwable e) {
|
|
||||||
if (e instanceof InvalidDisplayIdException) {
|
|
||||||
InvalidDisplayIdException idie = (InvalidDisplayIdException) e;
|
|
||||||
int[] displayIds = idie.getAvailableDisplayIds();
|
|
||||||
if (displayIds != null && displayIds.length > 0) {
|
|
||||||
Ln.e("Try to use one of the available display ids:");
|
|
||||||
for (int id : displayIds) {
|
|
||||||
Ln.e(" scrcpy --display " + id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (e instanceof InvalidEncoderException) {
|
|
||||||
InvalidEncoderException iee = (InvalidEncoderException) e;
|
|
||||||
MediaCodecInfo[] encoders = iee.getAvailableEncoders();
|
|
||||||
if (encoders != null && encoders.length > 0) {
|
|
||||||
Ln.e("Try to use one of the available encoders:");
|
|
||||||
for (MediaCodecInfo encoder : encoders) {
|
|
||||||
Ln.e(" scrcpy --encoder '" + encoder.getName() + "'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void main(String... args) throws Exception {
|
public static void main(String... args) throws Exception {
|
||||||
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
|
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
|
||||||
Ln.e("Exception on thread " + t, e);
|
Ln.e("Exception on thread " + t, e);
|
||||||
suggestFix(e);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Options options = createOptions(args);
|
Options options = createOptions(args);
|
||||||
|
|
||||||
Ln.initLogLevel(options.getLogLevel());
|
Ln.initLogLevel(options.getLogLevel());
|
||||||
|
|
||||||
|
try {
|
||||||
scrcpy(options);
|
scrcpy(options);
|
||||||
|
} catch (ConfigurationException e) {
|
||||||
|
// Do not print stack trace, a user-friendly error-message has already been logged
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.genymobile.scrcpy;
|
|||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.app.Instrumentation;
|
|
||||||
import android.content.ContextWrapper;
|
import android.content.ContextWrapper;
|
||||||
import android.content.pm.ApplicationInfo;
|
import android.content.pm.ApplicationInfo;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
|
|||||||
BIN
u/.ninja_deps
Normal file
BIN
u/.ninja_deps
Normal file
Binary file not shown.
62
u/.ninja_log
Normal file
62
u/.ninja_log
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# ninja log v5
|
||||||
|
0 243 1542027815 build.ninja ef03cd8523486e97
|
||||||
|
0 58 1542027815 app/app@@scrcpy@exe/src_str_util.c.o 2aa692e7aa83914
|
||||||
|
0 87 1542027815 app/app@@scrcpy@exe/src_sys_unix_net.c.o 7ea14bd07e90ff97
|
||||||
|
0 91 1542027815 app/app@@scrcpy@exe/src_sys_unix_command.c.o dd44ba15cc3d6a7e
|
||||||
|
1 113 1542027815 app/app@@scrcpy@exe/src_command.c.o 1eaa0f061a5c0447
|
||||||
|
0 114 1542027815 app/app@@scrcpy@exe/src_server.c.o 8b376071b5e0aaf1
|
||||||
|
1 117 1542027815 app/app@@scrcpy@exe/src_controller.c.o 907de440054c77e7
|
||||||
|
1 146 1542027815 app/app@@scrcpy@exe/src_control_event.c.o fcfa5a6c322ebf8b
|
||||||
|
91 202 1542027815 app/app@@scrcpy@exe/src_device.c.o 9ac9441f4f2e4d54
|
||||||
|
58 215 1542027815 app/app@@scrcpy@exe/src_convert.c.o 9de268e9b915094e
|
||||||
|
115 219 1542027815 app/app@@scrcpy@exe/src_fps_counter.c.o 22b968c51acd256b
|
||||||
|
114 235 1542027815 app/app@@scrcpy@exe/src_file_handler.c.o 11e303a26f189d9a
|
||||||
|
117 286 1542027815 app/app@@scrcpy@exe/src_frames.c.o 3c5c4dbee035e5ab
|
||||||
|
88 319 1542027815 app/app@@scrcpy@exe/src_decoder.c.o 60c1438cf7786895
|
||||||
|
202 338 1542027815 app/app@@scrcpy@exe/src_lock_util.c.o 9265bcc92f144427
|
||||||
|
215 367 1542027815 app/app@@scrcpy@exe/src_net.c.o 718f65aa73583163
|
||||||
|
220 408 1542027815 app/app@@scrcpy@exe/src_recorder.c.o 676a7500fb0d45cb
|
||||||
|
1 470 1542027815 app/app@@scrcpy@exe/src_tiny_xpm.c.o 91851ad29940a4b1
|
||||||
|
286 485 1542027815 app/app@@test_control_event_queue@exe/tests_test_control_event_queue.c.o 46bff52a98c0b5ca
|
||||||
|
319 487 1542027815 app/app@@test_control_event_queue@exe/src_control_event.c.o 76492af89a914173
|
||||||
|
1 488 1542027815 app/app@@scrcpy@exe/src_main.c.o e7dc8583797471c5
|
||||||
|
367 488 1542027815 app/app@@test_control_event_serialize@exe/src_control_event.c.o fcff2e1105474edf
|
||||||
|
0 497 1542027815 app/app@@scrcpy@exe/src_screen.c.o 329c18ec2111c8ff
|
||||||
|
408 515 1542027815 app/app@@test_strutil@exe/tests_test_strutil.c.o 15440f4bca20c50d
|
||||||
|
338 517 1542027815 app/app@@test_control_event_serialize@exe/tests_test_control_event_serialize.c.o baa0b48891372fcc
|
||||||
|
470 525 1542027815 app/app@@test_strutil@exe/src_str_util.c.o fcb3a91d36e23e11
|
||||||
|
525 561 1542027815 app/test_strutil 3448478dadf99adf
|
||||||
|
487 582 1542027815 app/test_control_event_queue bfca00bc894d3c4f
|
||||||
|
517 606 1542027815 app/test_control_event_serialize e06ab4ce04dd4fad
|
||||||
|
147 638 1542027815 app/app@@scrcpy@exe/src_input_manager.c.o 1fe285b256bf5908
|
||||||
|
236 713 1542027815 app/app@@scrcpy@exe/src_scrcpy.c.o 8b0bae90b272da98
|
||||||
|
713 891 1542027816 app/scrcpy 8fba96817bb2802c
|
||||||
|
485 5716 1542027820 server/scrcpy-server.jar 8511d30842df298f
|
||||||
|
0 264 1542027826 build.ninja ef03cd8523486e97
|
||||||
|
1 31 1542027826 app/app@@scrcpy@exe/src_fps_counter.c.o 22b968c51acd256b
|
||||||
|
1 44 1542027826 app/app@@scrcpy@exe/src_file_handler.c.o 11e303a26f189d9a
|
||||||
|
1 47 1542027826 app/app@@scrcpy@exe/src_controller.c.o 907de440054c77e7
|
||||||
|
2 50 1542027826 app/app@@scrcpy@exe/src_frames.c.o 3c5c4dbee035e5ab
|
||||||
|
2 50 1542027826 app/app@@scrcpy@exe/src_recorder.c.o 676a7500fb0d45cb
|
||||||
|
1 65 1542027826 app/app@@scrcpy@exe/src_decoder.c.o 60c1438cf7786895
|
||||||
|
31 82 1542027826 app/app@@scrcpy@exe/src_server.c.o 8b376071b5e0aaf1
|
||||||
|
2 108 1542027826 app/app@@scrcpy@exe/src_input_manager.c.o 1fe285b256bf5908
|
||||||
|
2 129 1542027826 app/app@@scrcpy@exe/src_screen.c.o 329c18ec2111c8ff
|
||||||
|
2 162 1542027826 app/app@@scrcpy@exe/src_scrcpy.c.o 8b0bae90b272da98
|
||||||
|
1 339 1542027826 app/app@@scrcpy@exe/src_main.c.o e7dc8583797471c5
|
||||||
|
339 538 1542027827 app/scrcpy 8fba96817bb2802c
|
||||||
|
44 753 1542027827 server/scrcpy-server.jar 8511d30842df298f
|
||||||
|
0 276 1542027871 build.ninja ef03cd8523486e97
|
||||||
|
1 37 1542027872 app/app@@scrcpy@exe/src_file_handler.c.o 11e303a26f189d9a
|
||||||
|
1 42 1542027872 app/app@@scrcpy@exe/src_controller.c.o 907de440054c77e7
|
||||||
|
1 45 1542027872 app/app@@scrcpy@exe/src_fps_counter.c.o 22b968c51acd256b
|
||||||
|
2 49 1542027872 app/app@@scrcpy@exe/src_recorder.c.o 676a7500fb0d45cb
|
||||||
|
1 52 1542027872 app/app@@scrcpy@exe/src_frames.c.o 3c5c4dbee035e5ab
|
||||||
|
0 64 1542027872 app/app@@scrcpy@exe/src_decoder.c.o 60c1438cf7786895
|
||||||
|
37 80 1542027872 app/app@@scrcpy@exe/src_server.c.o 8b376071b5e0aaf1
|
||||||
|
1 128 1542027872 app/app@@scrcpy@exe/src_input_manager.c.o 1fe285b256bf5908
|
||||||
|
2 138 1542027872 app/app@@scrcpy@exe/src_screen.c.o 329c18ec2111c8ff
|
||||||
|
2 150 1542027872 app/app@@scrcpy@exe/src_scrcpy.c.o 8b0bae90b272da98
|
||||||
|
1 370 1542027872 app/app@@scrcpy@exe/src_main.c.o e7dc8583797471c5
|
||||||
|
370 578 1542027872 app/scrcpy 8fba96817bb2802c
|
||||||
|
42 688 1542027872 server/scrcpy-server.jar 8511d30842df298f
|
||||||
BIN
u/app/app@@scrcpy@exe/src_command.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_command.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_control_event.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_control_event.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_controller.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_controller.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_convert.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_convert.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_decoder.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_decoder.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_device.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_device.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_file_handler.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_file_handler.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_fps_counter.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_fps_counter.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_frames.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_frames.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_input_manager.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_input_manager.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_lock_util.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_lock_util.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_main.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_main.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_net.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_net.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_recorder.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_recorder.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_scrcpy.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_scrcpy.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_screen.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_screen.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_server.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_server.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_str_util.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_str_util.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_sys_unix_command.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_sys_unix_command.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_sys_unix_net.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_sys_unix_net.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@scrcpy@exe/src_tiny_xpm.c.o
Normal file
BIN
u/app/app@@scrcpy@exe/src_tiny_xpm.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@test_control_event_queue@exe/src_control_event.c.o
Normal file
BIN
u/app/app@@test_control_event_queue@exe/src_control_event.c.o
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
u/app/app@@test_strutil@exe/src_str_util.c.o
Normal file
BIN
u/app/app@@test_strutil@exe/src_str_util.c.o
Normal file
Binary file not shown.
BIN
u/app/app@@test_strutil@exe/tests_test_strutil.c.o
Normal file
BIN
u/app/app@@test_strutil@exe/tests_test_strutil.c.o
Normal file
Binary file not shown.
29
u/app/config.h
Normal file
29
u/app/config.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Autogenerated by the Meson build system.
|
||||||
|
* Do not edit, your changes will be lost.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#define BUILD_DEBUG
|
||||||
|
|
||||||
|
#define DEFAULT_BIT_RATE 8000000
|
||||||
|
|
||||||
|
#define DEFAULT_LOCAL_PORT 27183
|
||||||
|
|
||||||
|
#define DEFAULT_MAX_SIZE 0
|
||||||
|
|
||||||
|
#define HIDPI_SUPPORT
|
||||||
|
|
||||||
|
#undef OVERRIDE_SERVER_PATH
|
||||||
|
|
||||||
|
#define PREFIX "/usr/local"
|
||||||
|
|
||||||
|
#define PREFIXED_SERVER_PATH "/share/scrcpy/scrcpy-server.jar"
|
||||||
|
|
||||||
|
#define SCRCPY_VERSION "1.6"
|
||||||
|
|
||||||
|
#define SKIP_FRAMES
|
||||||
|
|
||||||
|
#undef WINDOWS_NOCONSOLE
|
||||||
|
|
||||||
BIN
u/app/scrcpy
Executable file
BIN
u/app/scrcpy
Executable file
Binary file not shown.
BIN
u/app/test_control_event_queue
Executable file
BIN
u/app/test_control_event_queue
Executable file
Binary file not shown.
BIN
u/app/test_control_event_serialize
Executable file
BIN
u/app/test_control_event_serialize
Executable file
Binary file not shown.
BIN
u/app/test_strutil
Executable file
BIN
u/app/test_strutil
Executable file
Binary file not shown.
263
u/build.ninja
Normal file
263
u/build.ninja
Normal file
@@ -0,0 +1,263 @@
|
|||||||
|
# This is the build file for project "scrcpy"
|
||||||
|
# It is autogenerated by the Meson build system.
|
||||||
|
# Do not edit by hand.
|
||||||
|
|
||||||
|
ninja_required_version = 1.5.1
|
||||||
|
|
||||||
|
# Rules for compiling.
|
||||||
|
|
||||||
|
rule c_COMPILER
|
||||||
|
command = ccache cc $ARGS -MD -MQ $out -MF '$DEPFILE' -o $out -c $in
|
||||||
|
deps = gcc
|
||||||
|
depfile = $DEPFILE
|
||||||
|
description = Compiling C object $out.
|
||||||
|
|
||||||
|
rule c_PCH
|
||||||
|
command = ccache cc $ARGS -MD -MQ $out -MF '$DEPFILE' -o $out -c $in
|
||||||
|
deps = gcc
|
||||||
|
depfile = $DEPFILE
|
||||||
|
description = Precompiling header $in.
|
||||||
|
|
||||||
|
|
||||||
|
# Rules for linking.
|
||||||
|
|
||||||
|
rule STATIC_LINKER
|
||||||
|
command = rm -f $out && gcc-ar $LINK_ARGS $out $in
|
||||||
|
description = Linking static target $out.
|
||||||
|
|
||||||
|
rule c_LINKER
|
||||||
|
command = ccache cc $ARGS -o $out $in $LINK_ARGS $aliasing
|
||||||
|
description = Linking target $out.
|
||||||
|
|
||||||
|
|
||||||
|
rule SHSYM
|
||||||
|
command = /usr/bin/meson --internal symbolextractor $in $out $CROSS
|
||||||
|
restat = 1
|
||||||
|
description = Generating symbol file $out.
|
||||||
|
|
||||||
|
# Other rules
|
||||||
|
|
||||||
|
rule CUSTOM_COMMAND
|
||||||
|
command = $COMMAND
|
||||||
|
description = $DESC
|
||||||
|
restat = 1
|
||||||
|
|
||||||
|
rule CUSTOM_COMMAND_DEP
|
||||||
|
command = $COMMAND
|
||||||
|
description = $DESC
|
||||||
|
deps = gcc
|
||||||
|
depfile = $DEPFILE
|
||||||
|
restat = 1
|
||||||
|
|
||||||
|
rule REGENERATE_BUILD
|
||||||
|
command = /usr/bin/meson --internal regenerate /home/rom/projects/scrcpy /home/rom/projects/scrcpy/u --backend ninja
|
||||||
|
description = Regenerating build files.
|
||||||
|
generator = 1
|
||||||
|
|
||||||
|
|
||||||
|
# Phony build target, always out of date
|
||||||
|
build PHONY: phony
|
||||||
|
|
||||||
|
# Build rules for targets
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_main.c.o: c_COMPILER ../app/src/main.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_main.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_command.c.o: c_COMPILER ../app/src/command.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_command.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_control_event.c.o: c_COMPILER ../app/src/control_event.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_control_event.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_controller.c.o: c_COMPILER ../app/src/controller.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_controller.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_convert.c.o: c_COMPILER ../app/src/convert.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_convert.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_decoder.c.o: c_COMPILER ../app/src/decoder.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_decoder.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_device.c.o: c_COMPILER ../app/src/device.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_device.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_file_handler.c.o: c_COMPILER ../app/src/file_handler.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_file_handler.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_fps_counter.c.o: c_COMPILER ../app/src/fps_counter.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_fps_counter.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_frames.c.o: c_COMPILER ../app/src/frames.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_frames.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_input_manager.c.o: c_COMPILER ../app/src/input_manager.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_input_manager.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_lock_util.c.o: c_COMPILER ../app/src/lock_util.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_lock_util.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_net.c.o: c_COMPILER ../app/src/net.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_net.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_recorder.c.o: c_COMPILER ../app/src/recorder.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_recorder.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_scrcpy.c.o: c_COMPILER ../app/src/scrcpy.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_scrcpy.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_screen.c.o: c_COMPILER ../app/src/screen.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_screen.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_server.c.o: c_COMPILER ../app/src/server.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_server.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_str_util.c.o: c_COMPILER ../app/src/str_util.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_str_util.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_tiny_xpm.c.o: c_COMPILER ../app/src/tiny_xpm.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_tiny_xpm.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_sys_unix_command.c.o: c_COMPILER ../app/src/sys/unix/command.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_sys_unix_command.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@scrcpy@exe/src_sys_unix_net.c.o: c_COMPILER ../app/src/sys/unix/net.c
|
||||||
|
DEPFILE = app/app@@scrcpy@exe/src_sys_unix_net.c.o.d
|
||||||
|
ARGS = -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/scrcpy: c_LINKER app/app@@scrcpy@exe/src_main.c.o app/app@@scrcpy@exe/src_command.c.o app/app@@scrcpy@exe/src_control_event.c.o app/app@@scrcpy@exe/src_controller.c.o app/app@@scrcpy@exe/src_convert.c.o app/app@@scrcpy@exe/src_decoder.c.o app/app@@scrcpy@exe/src_device.c.o app/app@@scrcpy@exe/src_file_handler.c.o app/app@@scrcpy@exe/src_fps_counter.c.o app/app@@scrcpy@exe/src_frames.c.o app/app@@scrcpy@exe/src_input_manager.c.o app/app@@scrcpy@exe/src_lock_util.c.o app/app@@scrcpy@exe/src_net.c.o app/app@@scrcpy@exe/src_recorder.c.o app/app@@scrcpy@exe/src_scrcpy.c.o app/app@@scrcpy@exe/src_screen.c.o app/app@@scrcpy@exe/src_server.c.o app/app@@scrcpy@exe/src_str_util.c.o app/app@@scrcpy@exe/src_tiny_xpm.c.o app/app@@scrcpy@exe/src_sys_unix_command.c.o app/app@@scrcpy@exe/src_sys_unix_net.c.o | /usr/lib/x86_64-linux-gnu/libavformat.so /usr/lib/x86_64-linux-gnu/libavcodec.so /usr/lib/x86_64-linux-gnu/libavutil.so /usr/lib/x86_64-linux-gnu/libSDL2.so
|
||||||
|
LINK_ARGS = -Wl,--no-undefined -Wl,--as-needed -Wl,--start-group /usr/lib/x86_64-linux-gnu/libavformat.so /usr/lib/x86_64-linux-gnu/libavcodec.so /usr/lib/x86_64-linux-gnu/libavutil.so /usr/lib/x86_64-linux-gnu/libSDL2.so -Wl,--end-group
|
||||||
|
|
||||||
|
build app/app@@test_control_event_queue@exe/tests_test_control_event_queue.c.o: c_COMPILER ../app/tests/test_control_event_queue.c
|
||||||
|
DEPFILE = app/app@@test_control_event_queue@exe/tests_test_control_event_queue.c.o.d
|
||||||
|
ARGS = -Iapp/app@@test_control_event_queue@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@test_control_event_queue@exe/src_control_event.c.o: c_COMPILER ../app/src/control_event.c
|
||||||
|
DEPFILE = app/app@@test_control_event_queue@exe/src_control_event.c.o.d
|
||||||
|
ARGS = -Iapp/app@@test_control_event_queue@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/test_control_event_queue: c_LINKER app/app@@test_control_event_queue@exe/tests_test_control_event_queue.c.o app/app@@test_control_event_queue@exe/src_control_event.c.o | /usr/lib/x86_64-linux-gnu/libavformat.so /usr/lib/x86_64-linux-gnu/libavcodec.so /usr/lib/x86_64-linux-gnu/libavutil.so /usr/lib/x86_64-linux-gnu/libSDL2.so
|
||||||
|
LINK_ARGS = -Wl,--no-undefined -Wl,--as-needed -Wl,--start-group /usr/lib/x86_64-linux-gnu/libavformat.so /usr/lib/x86_64-linux-gnu/libavcodec.so /usr/lib/x86_64-linux-gnu/libavutil.so /usr/lib/x86_64-linux-gnu/libSDL2.so -Wl,--end-group
|
||||||
|
|
||||||
|
build app/app@@test_control_event_serialize@exe/tests_test_control_event_serialize.c.o: c_COMPILER ../app/tests/test_control_event_serialize.c
|
||||||
|
DEPFILE = app/app@@test_control_event_serialize@exe/tests_test_control_event_serialize.c.o.d
|
||||||
|
ARGS = -Iapp/app@@test_control_event_serialize@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@test_control_event_serialize@exe/src_control_event.c.o: c_COMPILER ../app/src/control_event.c
|
||||||
|
DEPFILE = app/app@@test_control_event_serialize@exe/src_control_event.c.o.d
|
||||||
|
ARGS = -Iapp/app@@test_control_event_serialize@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/test_control_event_serialize: c_LINKER app/app@@test_control_event_serialize@exe/tests_test_control_event_serialize.c.o app/app@@test_control_event_serialize@exe/src_control_event.c.o | /usr/lib/x86_64-linux-gnu/libavformat.so /usr/lib/x86_64-linux-gnu/libavcodec.so /usr/lib/x86_64-linux-gnu/libavutil.so /usr/lib/x86_64-linux-gnu/libSDL2.so
|
||||||
|
LINK_ARGS = -Wl,--no-undefined -Wl,--as-needed -Wl,--start-group /usr/lib/x86_64-linux-gnu/libavformat.so /usr/lib/x86_64-linux-gnu/libavcodec.so /usr/lib/x86_64-linux-gnu/libavutil.so /usr/lib/x86_64-linux-gnu/libSDL2.so -Wl,--end-group
|
||||||
|
|
||||||
|
build app/app@@test_strutil@exe/tests_test_strutil.c.o: c_COMPILER ../app/tests/test_strutil.c
|
||||||
|
DEPFILE = app/app@@test_strutil@exe/tests_test_strutil.c.o.d
|
||||||
|
ARGS = -Iapp/app@@test_strutil@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/app@@test_strutil@exe/src_str_util.c.o: c_COMPILER ../app/src/str_util.c
|
||||||
|
DEPFILE = app/app@@test_strutil@exe/src_str_util.c.o.d
|
||||||
|
ARGS = -Iapp/app@@test_strutil@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT
|
||||||
|
|
||||||
|
build app/test_strutil: c_LINKER app/app@@test_strutil@exe/tests_test_strutil.c.o app/app@@test_strutil@exe/src_str_util.c.o | /usr/lib/x86_64-linux-gnu/libavformat.so /usr/lib/x86_64-linux-gnu/libavcodec.so /usr/lib/x86_64-linux-gnu/libavutil.so /usr/lib/x86_64-linux-gnu/libSDL2.so
|
||||||
|
LINK_ARGS = -Wl,--no-undefined -Wl,--as-needed -Wl,--start-group /usr/lib/x86_64-linux-gnu/libavformat.so /usr/lib/x86_64-linux-gnu/libavcodec.so /usr/lib/x86_64-linux-gnu/libavutil.so /usr/lib/x86_64-linux-gnu/libSDL2.so -Wl,--end-group
|
||||||
|
|
||||||
|
build server/scrcpy-server.jar: CUSTOM_COMMAND ../server/. | /home/rom/projects/scrcpy/server/./scripts/build-wrapper.sh PHONY
|
||||||
|
COMMAND = /home/rom/projects/scrcpy/server/./scripts/build-wrapper.sh ../server/. server/scrcpy-server.jar debug
|
||||||
|
description = Generating$ scrcpy-server$ with$ a$ custom$ command.
|
||||||
|
|
||||||
|
build meson-run: CUSTOM_COMMAND
|
||||||
|
COMMAND = /usr/bin/meson --internal commandrunner /home/rom/projects/scrcpy /home/rom/projects/scrcpy/u '' /usr/bin/meson scripts/run-scrcpy.sh
|
||||||
|
description = Running$ external$ command$ run.
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build run: phony meson-run
|
||||||
|
|
||||||
|
# Test rules
|
||||||
|
|
||||||
|
build meson-test: CUSTOM_COMMAND all PHONY
|
||||||
|
COMMAND = /usr/bin/meson test --no-rebuild --print-errorlogs
|
||||||
|
DESC = Running$ all$ tests.
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build test: phony meson-test
|
||||||
|
|
||||||
|
build meson-benchmark: CUSTOM_COMMAND all PHONY
|
||||||
|
COMMAND = /usr/bin/meson test --benchmark --logbase benchmarklog --num-processes=1 --no-rebuild
|
||||||
|
DESC = Running$ benchmark$ suite.
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build benchmark: phony meson-benchmark
|
||||||
|
|
||||||
|
# Install rules
|
||||||
|
|
||||||
|
build meson-install: CUSTOM_COMMAND PHONY | all
|
||||||
|
DESC = Installing$ files.
|
||||||
|
COMMAND = /usr/bin/meson install --no-rebuild
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build install: phony meson-install
|
||||||
|
|
||||||
|
build meson-dist: CUSTOM_COMMAND PHONY
|
||||||
|
DESC = Creating$ source$ packages
|
||||||
|
COMMAND = /usr/bin/meson --internal dist /home/rom/projects/scrcpy /home/rom/projects/scrcpy/u /usr/bin/meson
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build dist: phony meson-dist
|
||||||
|
|
||||||
|
# Suffix
|
||||||
|
|
||||||
|
build meson-scan-build: CUSTOM_COMMAND PHONY
|
||||||
|
COMMAND = /usr/bin/meson --internal scanbuild /home/rom/projects/scrcpy /home/rom/projects/scrcpy/u /usr/bin/meson -Dbuild_app=true -Dbuild_server=true -Dcrossbuild_windows=false -Dhidpi_support=true -Doverride_server_path= -Dprebuilt_server= -Dskip_frames=true -Dwindows_noconsole=false
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build scan-build: phony meson-scan-build
|
||||||
|
|
||||||
|
build meson-uninstall: CUSTOM_COMMAND PHONY
|
||||||
|
COMMAND = /usr/bin/meson --internal uninstall
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build uninstall: phony meson-uninstall
|
||||||
|
|
||||||
|
build all: phony app/scrcpy app/test_control_event_queue app/test_control_event_serialize app/test_strutil server/scrcpy-server.jar
|
||||||
|
|
||||||
|
default all
|
||||||
|
|
||||||
|
build clean: phony meson-clean
|
||||||
|
|
||||||
|
build meson-clean-ctlist: CUSTOM_COMMAND PHONY
|
||||||
|
COMMAND = /usr/bin/meson --internal cleantrees /home/rom/projects/scrcpy/u/meson-private/cleantrees.dat
|
||||||
|
description = Cleaning$ custom$ target$ directories.
|
||||||
|
|
||||||
|
build clean-ctlist: phony meson-clean-ctlist
|
||||||
|
|
||||||
|
build meson-clean: CUSTOM_COMMAND PHONY | clean-ctlist
|
||||||
|
COMMAND = ninja -t clean
|
||||||
|
description = Cleaning.
|
||||||
|
|
||||||
|
build build.ninja: REGENERATE_BUILD ../meson.build ../app/meson.build ../server/meson.build meson-private/coredata.dat ../meson_options.txt
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build reconfigure: REGENERATE_BUILD PHONY
|
||||||
|
pool = console
|
||||||
|
|
||||||
|
build ../meson.build ../app/meson.build ../server/meson.build meson-private/coredata.dat ../meson_options.txt: phony
|
||||||
|
|
||||||
137
u/compile_commands.json
Normal file
137
u/compile_commands.json
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_main.c.o' -MF 'app/app@@scrcpy@exe/src_main.c.o.d' -o 'app/app@@scrcpy@exe/src_main.c.o' -c ../app/src/main.c",
|
||||||
|
"file": "../app/src/main.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_command.c.o' -MF 'app/app@@scrcpy@exe/src_command.c.o.d' -o 'app/app@@scrcpy@exe/src_command.c.o' -c ../app/src/command.c",
|
||||||
|
"file": "../app/src/command.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_control_event.c.o' -MF 'app/app@@scrcpy@exe/src_control_event.c.o.d' -o 'app/app@@scrcpy@exe/src_control_event.c.o' -c ../app/src/control_event.c",
|
||||||
|
"file": "../app/src/control_event.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_controller.c.o' -MF 'app/app@@scrcpy@exe/src_controller.c.o.d' -o 'app/app@@scrcpy@exe/src_controller.c.o' -c ../app/src/controller.c",
|
||||||
|
"file": "../app/src/controller.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_convert.c.o' -MF 'app/app@@scrcpy@exe/src_convert.c.o.d' -o 'app/app@@scrcpy@exe/src_convert.c.o' -c ../app/src/convert.c",
|
||||||
|
"file": "../app/src/convert.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_decoder.c.o' -MF 'app/app@@scrcpy@exe/src_decoder.c.o.d' -o 'app/app@@scrcpy@exe/src_decoder.c.o' -c ../app/src/decoder.c",
|
||||||
|
"file": "../app/src/decoder.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_device.c.o' -MF 'app/app@@scrcpy@exe/src_device.c.o.d' -o 'app/app@@scrcpy@exe/src_device.c.o' -c ../app/src/device.c",
|
||||||
|
"file": "../app/src/device.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_file_handler.c.o' -MF 'app/app@@scrcpy@exe/src_file_handler.c.o.d' -o 'app/app@@scrcpy@exe/src_file_handler.c.o' -c ../app/src/file_handler.c",
|
||||||
|
"file": "../app/src/file_handler.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_fps_counter.c.o' -MF 'app/app@@scrcpy@exe/src_fps_counter.c.o.d' -o 'app/app@@scrcpy@exe/src_fps_counter.c.o' -c ../app/src/fps_counter.c",
|
||||||
|
"file": "../app/src/fps_counter.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_frames.c.o' -MF 'app/app@@scrcpy@exe/src_frames.c.o.d' -o 'app/app@@scrcpy@exe/src_frames.c.o' -c ../app/src/frames.c",
|
||||||
|
"file": "../app/src/frames.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_input_manager.c.o' -MF 'app/app@@scrcpy@exe/src_input_manager.c.o.d' -o 'app/app@@scrcpy@exe/src_input_manager.c.o' -c ../app/src/input_manager.c",
|
||||||
|
"file": "../app/src/input_manager.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_lock_util.c.o' -MF 'app/app@@scrcpy@exe/src_lock_util.c.o.d' -o 'app/app@@scrcpy@exe/src_lock_util.c.o' -c ../app/src/lock_util.c",
|
||||||
|
"file": "../app/src/lock_util.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_net.c.o' -MF 'app/app@@scrcpy@exe/src_net.c.o.d' -o 'app/app@@scrcpy@exe/src_net.c.o' -c ../app/src/net.c",
|
||||||
|
"file": "../app/src/net.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_recorder.c.o' -MF 'app/app@@scrcpy@exe/src_recorder.c.o.d' -o 'app/app@@scrcpy@exe/src_recorder.c.o' -c ../app/src/recorder.c",
|
||||||
|
"file": "../app/src/recorder.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_scrcpy.c.o' -MF 'app/app@@scrcpy@exe/src_scrcpy.c.o.d' -o 'app/app@@scrcpy@exe/src_scrcpy.c.o' -c ../app/src/scrcpy.c",
|
||||||
|
"file": "../app/src/scrcpy.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_screen.c.o' -MF 'app/app@@scrcpy@exe/src_screen.c.o.d' -o 'app/app@@scrcpy@exe/src_screen.c.o' -c ../app/src/screen.c",
|
||||||
|
"file": "../app/src/screen.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_server.c.o' -MF 'app/app@@scrcpy@exe/src_server.c.o.d' -o 'app/app@@scrcpy@exe/src_server.c.o' -c ../app/src/server.c",
|
||||||
|
"file": "../app/src/server.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_str_util.c.o' -MF 'app/app@@scrcpy@exe/src_str_util.c.o.d' -o 'app/app@@scrcpy@exe/src_str_util.c.o' -c ../app/src/str_util.c",
|
||||||
|
"file": "../app/src/str_util.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_tiny_xpm.c.o' -MF 'app/app@@scrcpy@exe/src_tiny_xpm.c.o.d' -o 'app/app@@scrcpy@exe/src_tiny_xpm.c.o' -c ../app/src/tiny_xpm.c",
|
||||||
|
"file": "../app/src/tiny_xpm.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_sys_unix_command.c.o' -MF 'app/app@@scrcpy@exe/src_sys_unix_command.c.o.d' -o 'app/app@@scrcpy@exe/src_sys_unix_command.c.o' -c ../app/src/sys/unix/command.c",
|
||||||
|
"file": "../app/src/sys/unix/command.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@scrcpy@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@scrcpy@exe/src_sys_unix_net.c.o' -MF 'app/app@@scrcpy@exe/src_sys_unix_net.c.o.d' -o 'app/app@@scrcpy@exe/src_sys_unix_net.c.o' -c ../app/src/sys/unix/net.c",
|
||||||
|
"file": "../app/src/sys/unix/net.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@test_control_event_queue@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@test_control_event_queue@exe/tests_test_control_event_queue.c.o' -MF 'app/app@@test_control_event_queue@exe/tests_test_control_event_queue.c.o.d' -o 'app/app@@test_control_event_queue@exe/tests_test_control_event_queue.c.o' -c ../app/tests/test_control_event_queue.c",
|
||||||
|
"file": "../app/tests/test_control_event_queue.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@test_control_event_queue@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@test_control_event_queue@exe/src_control_event.c.o' -MF 'app/app@@test_control_event_queue@exe/src_control_event.c.o.d' -o 'app/app@@test_control_event_queue@exe/src_control_event.c.o' -c ../app/src/control_event.c",
|
||||||
|
"file": "../app/src/control_event.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@test_control_event_serialize@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@test_control_event_serialize@exe/tests_test_control_event_serialize.c.o' -MF 'app/app@@test_control_event_serialize@exe/tests_test_control_event_serialize.c.o.d' -o 'app/app@@test_control_event_serialize@exe/tests_test_control_event_serialize.c.o' -c ../app/tests/test_control_event_serialize.c",
|
||||||
|
"file": "../app/tests/test_control_event_serialize.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@test_control_event_serialize@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@test_control_event_serialize@exe/src_control_event.c.o' -MF 'app/app@@test_control_event_serialize@exe/src_control_event.c.o.d' -o 'app/app@@test_control_event_serialize@exe/src_control_event.c.o' -c ../app/src/control_event.c",
|
||||||
|
"file": "../app/src/control_event.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@test_strutil@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@test_strutil@exe/tests_test_strutil.c.o' -MF 'app/app@@test_strutil@exe/tests_test_strutil.c.o.d' -o 'app/app@@test_strutil@exe/tests_test_strutil.c.o' -c ../app/tests/test_strutil.c",
|
||||||
|
"file": "../app/tests/test_strutil.c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"directory": "/home/rom/projects/scrcpy/u",
|
||||||
|
"command": "ccache cc -Iapp/app@@test_strutil@exe -Iapp -I../app -I../app/src -I/usr/include/x86_64-linux-gnu -I/usr/include/SDL2 -fdiagnostics-color=always -pipe -D_FILE_OFFSET_BITS=64 -Wall -Winvalid-pch -std=c11 -g -D_REENTRANT -MD -MQ 'app/app@@test_strutil@exe/src_str_util.c.o' -MF 'app/app@@test_strutil@exe/src_str_util.c.o.d' -o 'app/app@@test_strutil@exe/src_str_util.c.o' -c ../app/src/str_util.c",
|
||||||
|
"file": "../app/src/str_util.c"
|
||||||
|
}
|
||||||
|
]
|
||||||
38
u/meson-logs/meson-log.txt
Normal file
38
u/meson-logs/meson-log.txt
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
Build started at 2018-11-12T14:04:31.900569
|
||||||
|
Main binary: /usr/bin/python3
|
||||||
|
Python system: Linux
|
||||||
|
The Meson build system
|
||||||
|
Version: 0.48.1
|
||||||
|
Source dir: /home/rom/projects/scrcpy
|
||||||
|
Build dir: /home/rom/projects/scrcpy/u
|
||||||
|
Build type: native build
|
||||||
|
Project name: scrcpy
|
||||||
|
Project version: 1.6
|
||||||
|
Native C compiler: ccache cc (gcc 8.2.0 "cc (Debian 8.2.0-9) 8.2.0")
|
||||||
|
Build machine cpu family: x86_64
|
||||||
|
Build machine cpu: x86_64
|
||||||
|
Dependency libavformat found: YES (cached)
|
||||||
|
Dependency libavcodec found: YES (cached)
|
||||||
|
Dependency libavutil found: YES (cached)
|
||||||
|
Dependency sdl2 found: YES (cached)
|
||||||
|
Configuring config.h using configuration
|
||||||
|
Adding test "test_control_event_queue"
|
||||||
|
Adding test "test_control_event_serialize"
|
||||||
|
Adding test "test_strutil"
|
||||||
|
Program ./scripts/build-wrapper.sh found: YES (/home/rom/projects/scrcpy/server/./scripts/build-wrapper.sh)
|
||||||
|
DEPRECATION: build_always is deprecated. Combine build_by_default and build_always_stale instead.
|
||||||
|
Build targets in project: 6
|
||||||
|
Found ninja-1.8.2 at /usr/bin/ninja
|
||||||
|
Running compile:
|
||||||
|
Working directory: /tmp/tmpk1bh9k5g
|
||||||
|
Command line: ccache cc /tmp/tmpk1bh9k5g/testfile.c -pipe -D_FILE_OFFSET_BITS=64 -c -o /tmp/tmpk1bh9k5g/output.obj -O0 --print-search-dirs
|
||||||
|
|
||||||
|
Code:
|
||||||
|
|
||||||
|
Compiler stdout:
|
||||||
|
install: /usr/lib/gcc/x86_64-linux-gnu/8/
|
||||||
|
programs: =/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../x86_64-linux-gnu/bin/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../x86_64-linux-gnu/bin/
|
||||||
|
libraries: =/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../x86_64-linux-gnu/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../lib/:/lib/x86_64-linux-gnu/8/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/8/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../x86_64-linux-gnu/lib/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../:/lib/:/usr/lib/
|
||||||
|
|
||||||
|
Compiler stderr:
|
||||||
|
|
||||||
BIN
u/meson-private/build.dat
Normal file
BIN
u/meson-private/build.dat
Normal file
Binary file not shown.
BIN
u/meson-private/cleantrees.dat
Normal file
BIN
u/meson-private/cleantrees.dat
Normal file
Binary file not shown.
BIN
u/meson-private/coredata.dat
Normal file
BIN
u/meson-private/coredata.dat
Normal file
Binary file not shown.
BIN
u/meson-private/coredata.dat.prev
Normal file
BIN
u/meson-private/coredata.dat.prev
Normal file
Binary file not shown.
BIN
u/meson-private/install.dat
Normal file
BIN
u/meson-private/install.dat
Normal file
Binary file not shown.
0
u/meson-private/meson.lock
Normal file
0
u/meson-private/meson.lock
Normal file
BIN
u/meson-private/meson_benchmark_setup.dat
Normal file
BIN
u/meson-private/meson_benchmark_setup.dat
Normal file
Binary file not shown.
BIN
u/meson-private/meson_test_setup.dat
Normal file
BIN
u/meson-private/meson_test_setup.dat
Normal file
Binary file not shown.
1
u/meson-private/sanitycheckc.c
Normal file
1
u/meson-private/sanitycheckc.c
Normal file
@@ -0,0 +1 @@
|
|||||||
|
int main(int argc, char **argv) { int class=0; return class; }
|
||||||
BIN
u/meson-private/sanitycheckc.exe
Executable file
BIN
u/meson-private/sanitycheckc.exe
Executable file
Binary file not shown.
BIN
u/server/scrcpy-server.jar
Normal file
BIN
u/server/scrcpy-server.jar
Normal file
Binary file not shown.
Reference in New Issue
Block a user