mirror of
				http://www.pogo.org.uk/~mark/trx.git
				synced 2025-10-31 04:22:05 +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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Mark Hills
						Mark Hills