From e6f53b730328093831f992f1bac78cdb2e266ded Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca> Date: Sun, 30 Jan 2011 23:44:51 -0500 Subject: [PATCH] Updated to CELT's new API --- celt | 2 +- configure.ac | 2 +- src/opus_decoder.c | 34 +++++++++++++++++++++------------- src/opus_decoder.h | 1 - src/opus_encoder.c | 45 ++++++++++++++++++++++++++------------------- src/opus_encoder.h | 1 - 6 files changed, 49 insertions(+), 36 deletions(-) diff --git a/celt b/celt index 620e716b7..8cf29f099 160000 --- a/celt +++ b/celt @@ -1 +1 @@ -Subproject commit 620e716b764eb643e0a376f64f55448ad9447eb2 +Subproject commit 8cf29f0991bea7460adbd90fd39d95328b9a3065 diff --git a/configure.ac b/configure.ac index 950609ab5..8dc2c1d8f 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.59]) AC_INIT(src/opus.h) -AM_INIT_AUTOMAKE(opus,20101113) +AM_INIT_AUTOMAKE(opus,20110122) # Checks for programs. AC_PROG_CC diff --git a/src/opus_decoder.c b/src/opus_decoder.c index 3db3dcba6..d15c97682 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -46,25 +46,20 @@ OpusDecoder *opus_decoder_create(int Fs) { char *raw_state; int ret, silkDecSizeBytes, celtDecSizeBytes; - CELTMode *celtMode; OpusDecoder *st; - /* We should not have to create a CELT mode for each encoder state */ - celtMode = celt_mode_create(Fs, Fs/50, NULL); - /* Initialize SILK encoder */ ret = SKP_Silk_SDK_Get_Decoder_Size( &silkDecSizeBytes ); if( ret ) { /* Handle error */ } - celtDecSizeBytes = celt_decoder_get_size(celtMode, 1); + celtDecSizeBytes = celt_decoder_get_size(1); raw_state = calloc(sizeof(OpusDecoder)+silkDecSizeBytes+celtDecSizeBytes, 1); st = (OpusDecoder*)raw_state; st->silk_dec = (void*)(raw_state+sizeof(OpusDecoder)); st->celt_dec = (CELTDecoder*)(raw_state+sizeof(OpusDecoder)+silkDecSizeBytes); st->Fs = Fs; - st->celt_mode = celtMode; /* Reset decoder */ ret = SKP_Silk_SDK_InitDecoder( st->silk_dec ); @@ -73,7 +68,7 @@ OpusDecoder *opus_decoder_create(int Fs) } /* Initialize CELT decoder */ - st->celt_dec = celt_decoder_init(st->celt_dec, st->celt_mode, 1, NULL); + st->celt_dec = celt_decoder_init(st->celt_dec, 48000, 1, NULL); return st; @@ -166,10 +161,25 @@ int opus_decode(OpusDecoder *st, const unsigned char *data, if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND) { - if (st->bandwidth == BANDWIDTH_SUPERWIDEBAND) - celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(20)); - else - celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(21)); + int endband; + + switch(st->bandwidth) + { + case BANDWIDTH_NARROWBAND: + endband = 13; + break; + case BANDWIDTH_WIDEBAND: + endband = 17; + break; + case BANDWIDTH_SUPERWIDEBAND: + endband = 19; + break; + case BANDWIDTH_FULLBAND: + endband = 21; + break; + } + celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(endband)); + /* Encode high band with CELT */ celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm_celt, frame_size, &dec); for (i=0;i<frame_size;i++) @@ -221,7 +231,5 @@ void opus_decoder_ctl(OpusDecoder *st, int request, ...) void opus_decoder_destroy(OpusDecoder *st) { - celt_mode_destroy(st->celt_mode); - free(st); } diff --git a/src/opus_decoder.h b/src/opus_decoder.h index 9bb810615..c7a3be6b6 100644 --- a/src/opus_decoder.h +++ b/src/opus_decoder.h @@ -36,7 +36,6 @@ #include "opus.h" struct OpusDecoder { - CELTMode *celt_mode; CELTDecoder *celt_dec; void *silk_dec; diff --git a/src/opus_encoder.c b/src/opus_encoder.c index f66b189be..7de1b21ca 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -44,27 +44,22 @@ OpusEncoder *opus_encoder_create(int Fs) { char *raw_state; - CELTMode *celtMode; OpusEncoder *st; int ret, silkEncSizeBytes, celtEncSizeBytes; SKP_SILK_SDK_EncControlStruct encControl; - /* We should not have to create a CELT mode for each encoder state */ - celtMode = celt_mode_create(Fs, Fs/50, NULL); - /* Create SILK encoder */ ret = SKP_Silk_SDK_Get_Encoder_Size( &silkEncSizeBytes ); if( ret ) { /* Handle error */ } - celtEncSizeBytes = celt_encoder_get_size(celtMode, 1); + celtEncSizeBytes = celt_encoder_get_size(1); raw_state = calloc(sizeof(OpusEncoder)+silkEncSizeBytes+celtEncSizeBytes, 1); st = (OpusEncoder*)raw_state; st->silk_enc = (void*)(raw_state+sizeof(OpusEncoder)); st->celt_enc = (CELTEncoder*)(raw_state+sizeof(OpusEncoder)+silkEncSizeBytes); st->Fs = Fs; - st->celt_mode = celtMode; /*encControl.API_sampleRate = st->Fs; encControl.packetLossPercentage = 0; @@ -78,7 +73,7 @@ OpusEncoder *opus_encoder_create(int Fs) /* Create CELT encoder */ /* Initialize CELT encoder */ - st->celt_enc = celt_encoder_init(st->celt_enc, st->celt_mode, 1, NULL); + st->celt_enc = celt_encoder_init(st->celt_enc, Fs, 1, NULL); st->mode = MODE_HYBRID; st->bandwidth = BANDWIDTH_FULLBAND; @@ -119,19 +114,19 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, if (st->Fs == 100 * frame_size) encControl.bitRate -= 5000; } - encControl.payloadSize_ms = 1000 * frame_size / st->Fs; + encControl.payloadSize_ms = 1000 * frame_size / st->Fs; - if (st->mode == MODE_HYBRID) - encControl.minInternalSampleRate = 16000; - else - encControl.minInternalSampleRate = 8000; + if (st->mode == MODE_HYBRID) + encControl.minInternalSampleRate = 16000; + else + encControl.minInternalSampleRate = 8000; if (st->bandwidth == BANDWIDTH_NARROWBAND) encControl.maxInternalSampleRate = 8000; else if (st->bandwidth == BANDWIDTH_MEDIUMBAND) - encControl.maxInternalSampleRate = 12000; + encControl.maxInternalSampleRate = 12000; else - encControl.maxInternalSampleRate = 16000; + encControl.maxInternalSampleRate = 16000; /* Call SILK encoder for the low band */ nBytes = bytes_per_packet; @@ -153,12 +148,25 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size, if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND) { + int endband; short pcm_buf[960]; - if (st->bandwidth == BANDWIDTH_SUPERWIDEBAND) - celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(20)); - else - celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(21)); + switch(st->bandwidth) + { + case BANDWIDTH_NARROWBAND: + endband = 13; + break; + case BANDWIDTH_WIDEBAND: + endband = 17; + break; + case BANDWIDTH_SUPERWIDEBAND: + endband = 19; + break; + case BANDWIDTH_FULLBAND: + endband = 21; + break; + } + celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(endband)); for (i=0;i<ENCODER_DELAY_COMPENSATION;i++) pcm_buf[i] = st->delay_buffer[i]; @@ -269,7 +277,6 @@ void opus_encoder_ctl(OpusEncoder *st, int request, ...) void opus_encoder_destroy(OpusEncoder *st) { - celt_mode_destroy(st->celt_mode); free(st); } diff --git a/src/opus_encoder.h b/src/opus_encoder.h index 8c952abb1..37d43700b 100644 --- a/src/opus_encoder.h +++ b/src/opus_encoder.h @@ -40,7 +40,6 @@ #define ENCODER_DELAY_COMPENSATION 130 struct OpusEncoder { - CELTMode *celt_mode; CELTEncoder *celt_enc; void *silk_enc; -- GitLab