mirror of
http://www.pogo.org.uk/~mark/trx.git
synced 2024-12-22 15:35:06 +01:00
Port to use opus codec
This commit is contained in:
parent
52f99e9531
commit
8c5bec31da
4
Makefile
4
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
|
||||
|
||||
|
40
rx.c
40
rx.c
@ -1,7 +1,7 @@
|
||||
#include <netdb.h>
|
||||
#include <string.h>
|
||||
#include <alsa/asoundlib.h>
|
||||
#include <celt/celt.h>
|
||||
#include <opus/opus.h>
|
||||
#include <ortp/ortp.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
@ -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;
|
||||
}
|
||||
|
34
tx.c
34
tx.c
@ -1,7 +1,7 @@
|
||||
#include <netdb.h>
|
||||
#include <string.h>
|
||||
#include <alsa/asoundlib.h>
|
||||
#include <celt/celt.h>
|
||||
#include <opus/opus.h>
|
||||
#include <ortp/ortp.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user