Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1dce6abf20 | ||
|
|
dd4c5d3820 |
@@ -28,7 +28,6 @@ sc_demuxer_recv_codec_id(struct sc_demuxer *demuxer) {
|
||||
#define SC_CODEC_ID_H264 UINT32_C(0x68323634) // "h264" in ASCII
|
||||
#define SC_CODEC_ID_H265 UINT32_C(0x68323635) // "h265" in ASCII
|
||||
#define SC_CODEC_ID_AV1 UINT32_C(0x00617631) // "av1" in ASCII
|
||||
#define SC_CODEC_ID_OPUS UINT32_C(0x6f707573) // "opus" in ASCII
|
||||
uint32_t codec_id = sc_read32be(data);
|
||||
switch (codec_id) {
|
||||
case SC_CODEC_ID_H264:
|
||||
@@ -37,8 +36,6 @@ sc_demuxer_recv_codec_id(struct sc_demuxer *demuxer) {
|
||||
return AV_CODEC_ID_HEVC;
|
||||
case SC_CODEC_ID_AV1:
|
||||
return AV_CODEC_ID_AV1;
|
||||
case SC_CODEC_ID_OPUS:
|
||||
return AV_CODEC_ID_OPUS;
|
||||
default:
|
||||
LOGE("Unknown codec id 0x%08" PRIx32, codec_id);
|
||||
return AV_CODEC_ID_NONE;
|
||||
@@ -273,12 +270,10 @@ end:
|
||||
}
|
||||
|
||||
void
|
||||
sc_demuxer_init(struct sc_demuxer *demuxer, enum sc_stream_id stream_id,
|
||||
sc_socket socket, const struct sc_demuxer_callbacks *cbs,
|
||||
void *cbs_userdata) {
|
||||
sc_demuxer_init(struct sc_demuxer *demuxer, sc_socket socket,
|
||||
const struct sc_demuxer_callbacks *cbs, void *cbs_userdata) {
|
||||
assert(socket != SC_SOCKET_NONE);
|
||||
|
||||
demuxer->stream_id = stream_id;
|
||||
demuxer->socket = socket;
|
||||
demuxer->pending = NULL;
|
||||
demuxer->sink_count = 0;
|
||||
|
||||
@@ -14,13 +14,7 @@
|
||||
|
||||
#define SC_DEMUXER_MAX_SINKS 2
|
||||
|
||||
enum sc_stream_id {
|
||||
SC_STREAM_ID_VIDEO,
|
||||
SC_STREAM_ID_AUDIO,
|
||||
};
|
||||
|
||||
struct sc_demuxer {
|
||||
enum sc_stream_id stream_id;
|
||||
sc_socket socket;
|
||||
sc_thread thread;
|
||||
|
||||
@@ -42,9 +36,8 @@ struct sc_demuxer_callbacks {
|
||||
};
|
||||
|
||||
void
|
||||
sc_demuxer_init(struct sc_demuxer *demuxer, enum sc_stream_id stream_id,
|
||||
sc_socket socket, const struct sc_demuxer_callbacks *cbs,
|
||||
void *cbs_userdata);
|
||||
sc_demuxer_init(struct sc_demuxer *demuxer, sc_socket socket,
|
||||
const struct sc_demuxer_callbacks *cbs, void *cbs_userdata);
|
||||
|
||||
void
|
||||
sc_demuxer_add_sink(struct sc_demuxer *demuxer, struct sc_packet_sink *sink);
|
||||
|
||||
@@ -434,15 +434,15 @@ scrcpy(struct scrcpy_options *options) {
|
||||
static const struct sc_demuxer_callbacks video_demuxer_cbs = {
|
||||
.on_eos = sc_video_demuxer_on_eos,
|
||||
};
|
||||
sc_demuxer_init(&s->video_demuxer, SC_STREAM_ID_VIDEO,
|
||||
s->server.video_socket, &video_demuxer_cbs, NULL);
|
||||
sc_demuxer_init(&s->video_demuxer, s->server.video_socket,
|
||||
&video_demuxer_cbs, NULL);
|
||||
|
||||
if (options->audio) {
|
||||
static const struct sc_demuxer_callbacks audio_demuxer_cbs = {
|
||||
.on_eos = sc_audio_demuxer_on_eos,
|
||||
};
|
||||
sc_demuxer_init(&s->audio_demuxer, SC_STREAM_ID_AUDIO,
|
||||
s->server.audio_socket, &audio_demuxer_cbs, NULL);
|
||||
sc_demuxer_init(&s->audio_demuxer, s->server.audio_socket,
|
||||
&audio_demuxer_cbs, NULL);
|
||||
}
|
||||
|
||||
if (dec) {
|
||||
|
||||
@@ -47,11 +47,11 @@ public final class AudioEncoder {
|
||||
private static int BUFFER_MS = 15; // milliseconds
|
||||
private static final int BUFFER_SIZE = SAMPLE_RATE * CHANNELS * BUFFER_MS / 1000;
|
||||
|
||||
private final Streamer streamer;
|
||||
|
||||
private AudioRecord recorder;
|
||||
private MediaCodec mediaCodec;
|
||||
|
||||
private final AtomicBoolean cleanUpDone = new AtomicBoolean(false);
|
||||
|
||||
// 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.
|
||||
private final BlockingQueue<InputTask> inputTasks = new ArrayBlockingQueue<>(64);
|
||||
@@ -65,10 +65,6 @@ public final class AudioEncoder {
|
||||
|
||||
private boolean ended;
|
||||
|
||||
public AudioEncoder(Streamer streamer) {
|
||||
this.streamer = streamer;
|
||||
}
|
||||
|
||||
private static AudioFormat createAudioFormat() {
|
||||
AudioFormat.Builder builder = new AudioFormat.Builder();
|
||||
builder.setEncoding(AudioFormat.ENCODING_PCM_16BIT);
|
||||
@@ -146,13 +142,11 @@ public final class AudioEncoder {
|
||||
}
|
||||
|
||||
private void outputThread() throws IOException, InterruptedException {
|
||||
streamer.writeHeader();
|
||||
|
||||
while (!Thread.currentThread().isInterrupted()) {
|
||||
OutputTask task = outputTasks.take();
|
||||
ByteBuffer buffer = mediaCodec.getOutputBuffer(task.index);
|
||||
try {
|
||||
streamer.writePacket(buffer, task.bufferInfo);
|
||||
Ln.i("Audio packet [pts=" + task.bufferInfo.presentationTimeUs + "] " + buffer.remaining() + " bytes");
|
||||
} finally {
|
||||
mediaCodec.releaseOutputBuffer(task.index, false);
|
||||
}
|
||||
|
||||
@@ -111,8 +111,7 @@ public final class Server {
|
||||
|
||||
AudioEncoder audioEncoder = null;
|
||||
if (audio) {
|
||||
Streamer audioStreamer = new Streamer(connection.getAudioFd(), AudioCodec.OPUS, options.getSendCodecId(), options.getSendFrameMeta());
|
||||
audioEncoder = new AudioEncoder(audioStreamer);
|
||||
audioEncoder = new AudioEncoder();
|
||||
audioEncoder.start();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user