From 8c5bec31dabc53898dc962df7c9f312ff5893800 Mon Sep 17 00:00:00 2001 From: Mark Hills Date: Sat, 21 Jul 2012 16:14:13 +0100 Subject: [PATCH] Port to use opus codec --- Makefile | 4 ++-- rx.c | 40 +++++++++++++++++----------------------- tx.c | 34 +++++++++++++--------------------- 3 files changed, 32 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index d9c89eb..383e4ff 100644 --- a/Makefile +++ b/Makefile @@ -3,10 +3,10 @@ CFLAGS+=-MMD -Wall LDLIBS_ASOUND?=-lasound -LDLIBS_CELT?=-lcelt +LDLIBS_OPUS?=-lopus LDLIBS_ORTP?=-lortp -LDLIBS+=$(LDLIBS_ASOUND) $(LDLIBS_CELT) $(LDLIBS_ORTP) +LDLIBS+=$(LDLIBS_ASOUND) $(LDLIBS_OPUS) $(LDLIBS_ORTP) .PHONY: all clean diff --git a/rx.c b/rx.c index 4a1acce..4884788 100644 --- a/rx.c +++ b/rx.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include #include @@ -38,7 +38,7 @@ static RtpSession* create_rtp_recv(const char *addr_desc, const int port, static int play_one_frame(void *packet, size_t len, - CELTDecoder *decoder, + OpusDecoder *decoder, snd_pcm_t *snd, const unsigned int channels, const snd_pcm_uframes_t samples) @@ -50,28 +50,28 @@ static int play_one_frame(void *packet, pcm = alloca(sizeof(float) * samples * channels); if (packet == NULL) { - r = celt_decode_float(decoder, NULL, 0, pcm); + r = opus_decode_float(decoder, NULL, 0, pcm, samples, 1); } else { - r = celt_decode_float(decoder, packet, len, pcm); + r = opus_decode_float(decoder, packet, len, pcm, samples, 0); } - if (r != 0) { - fputs("Error in celt_decode\n", stderr); + if (r < 0) { + fprintf(stderr, "opus_decode: %s\n", opus_strerror(r)); return -1; } - f = snd_pcm_writei(snd, pcm, samples); + f = snd_pcm_writei(snd, pcm, r); if (f < 0) { aerror("snd_pcm_writei", f); return -1; } - if (f < samples) + if (f < r) fprintf(stderr, "Short write %ld\n", f); - return 0; + return r; } static int run_rx(RtpSession *session, - CELTDecoder *decoder, + OpusDecoder *decoder, snd_pcm_t *snd, const unsigned int channels, const snd_pcm_uframes_t frame) @@ -101,7 +101,7 @@ static int run_rx(RtpSession *session, if (r == -1) return -1; - ts += frame; + ts += r; } } @@ -138,10 +138,9 @@ static void usage(FILE *fd) int main(int argc, char *argv[]) { - int r; + int r, error; snd_pcm_t *snd; - CELTMode *mode; - CELTDecoder *decoder; + OpusDecoder *decoder; RtpSession *session; /* command-line options */ @@ -191,14 +190,10 @@ int main(int argc, char *argv[]) } } - mode = celt_mode_create(rate, channels, frame, NULL); - if (mode == NULL) { - fputs("celt_mode_create failed\n", stderr); - return -1; - } - decoder = celt_decoder_create(mode); + decoder = opus_decoder_create(rate, channels, &error); if (decoder == NULL) { - fputs("celt_decoder_create failed\n", stderr); + fprintf(stderr, "opus_decoder_create: %s\n", + opus_strerror(error)); return -1; } @@ -229,8 +224,7 @@ int main(int argc, char *argv[]) ortp_exit(); ortp_global_stats_display(); - celt_decoder_destroy(decoder); - celt_mode_destroy(mode); + opus_decoder_destroy(decoder); return r; } diff --git a/tx.c b/tx.c index 421ba48..7479038 100644 --- a/tx.c +++ b/tx.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include #include #include @@ -36,7 +36,7 @@ static RtpSession* create_rtp_send(const char *addr_desc, const int port) static int send_one_frame(snd_pcm_t *snd, const unsigned int channels, const snd_pcm_uframes_t samples, - CELTEncoder *encoder, + OpusEncoder *encoder, const size_t bytes_per_frame, RtpSession *session) { @@ -57,9 +57,9 @@ static int send_one_frame(snd_pcm_t *snd, if (f < samples) fprintf(stderr, "Short read, %ld\n", f); - z = celt_encode_float(encoder, pcm, NULL, packet, bytes_per_frame); + z = opus_encode_float(encoder, pcm, samples, packet, bytes_per_frame); if (z < 0) { - fputs("celt_encode_float failed\n", stderr); + fprintf(stderr, "opus_encode_float: %s\n", opus_strerror(z)); return -1; } @@ -72,7 +72,7 @@ static int send_one_frame(snd_pcm_t *snd, static int run_tx(snd_pcm_t *snd, const unsigned int channels, const snd_pcm_uframes_t frame, - CELTEncoder *encoder, + OpusEncoder *encoder, const size_t bytes_per_frame, RtpSession *session) { @@ -123,11 +123,10 @@ static void usage(FILE *fd) int main(int argc, char *argv[]) { - int r; + int r, error; size_t bytes_per_frame; snd_pcm_t *snd; - CELTMode *mode; - CELTEncoder *encoder; + OpusEncoder *encoder; RtpSession *session; /* command-line options */ @@ -183,20 +182,14 @@ int main(int argc, char *argv[]) } } - mode = celt_mode_create(rate, channels, frame, NULL); - if (mode == NULL) { - fputs("celt_mode_create failed\n", stderr); - return -1; - } - encoder = celt_encoder_create(mode); + encoder = opus_encoder_create(rate, channels, OPUS_APPLICATION_AUDIO, + &error); if (encoder == NULL) { - fputs("celt_encoder_create failed\n", stderr); - return -1; - } - if (celt_encoder_ctl(encoder, CELT_SET_PREDICTION(2)) != CELT_OK) { - fputs("CELT_SET_PREDICTION failed\n", stderr); + fprintf(stderr, "opus_encoder_create: %s\n", + opus_strerror(error)); return -1; } + bytes_per_frame = kbps * 1024 * frame / rate / 8; if (go_realtime() != 0) @@ -227,8 +220,7 @@ int main(int argc, char *argv[]) ortp_exit(); ortp_global_stats_display(); - celt_encoder_destroy(encoder); - celt_mode_destroy(mode); + opus_encoder_destroy(encoder); return r; }