Compare commits

..

2 Commits

Author SHA1 Message Date
Romain Vimont
1dce6abf20 AudioEncoder WIP 2023-02-07 23:23:45 +01:00
Romain Vimont
dd4c5d3820 audio demuxer 2023-02-07 23:12:54 +01:00
5 changed files with 12 additions and 31 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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);
}

View File

@@ -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();
}