Updated to CELT's new API

This commit is contained in:
Jean-Marc Valin 2011-01-30 23:44:51 -05:00
parent 3c8bd3ffc7
commit e6f53b7303
6 changed files with 49 additions and 36 deletions

2
celt

@ -1 +1 @@
Subproject commit 620e716b764eb643e0a376f64f55448ad9447eb2 Subproject commit 8cf29f0991bea7460adbd90fd39d95328b9a3065

View file

@ -3,7 +3,7 @@
AC_PREREQ([2.59]) AC_PREREQ([2.59])
AC_INIT(src/opus.h) AC_INIT(src/opus.h)
AM_INIT_AUTOMAKE(opus,20101113) AM_INIT_AUTOMAKE(opus,20110122)
# Checks for programs. # Checks for programs.
AC_PROG_CC AC_PROG_CC

View file

@ -46,25 +46,20 @@ OpusDecoder *opus_decoder_create(int Fs)
{ {
char *raw_state; char *raw_state;
int ret, silkDecSizeBytes, celtDecSizeBytes; int ret, silkDecSizeBytes, celtDecSizeBytes;
CELTMode *celtMode;
OpusDecoder *st; 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 */ /* Initialize SILK encoder */
ret = SKP_Silk_SDK_Get_Decoder_Size( &silkDecSizeBytes ); ret = SKP_Silk_SDK_Get_Decoder_Size( &silkDecSizeBytes );
if( ret ) { if( ret ) {
/* Handle error */ /* Handle error */
} }
celtDecSizeBytes = celt_decoder_get_size(celtMode, 1); celtDecSizeBytes = celt_decoder_get_size(1);
raw_state = calloc(sizeof(OpusDecoder)+silkDecSizeBytes+celtDecSizeBytes, 1); raw_state = calloc(sizeof(OpusDecoder)+silkDecSizeBytes+celtDecSizeBytes, 1);
st = (OpusDecoder*)raw_state; st = (OpusDecoder*)raw_state;
st->silk_dec = (void*)(raw_state+sizeof(OpusDecoder)); st->silk_dec = (void*)(raw_state+sizeof(OpusDecoder));
st->celt_dec = (CELTDecoder*)(raw_state+sizeof(OpusDecoder)+silkDecSizeBytes); st->celt_dec = (CELTDecoder*)(raw_state+sizeof(OpusDecoder)+silkDecSizeBytes);
st->Fs = Fs; st->Fs = Fs;
st->celt_mode = celtMode;
/* Reset decoder */ /* Reset decoder */
ret = SKP_Silk_SDK_InitDecoder( st->silk_dec ); ret = SKP_Silk_SDK_InitDecoder( st->silk_dec );
@ -73,7 +68,7 @@ OpusDecoder *opus_decoder_create(int Fs)
} }
/* Initialize CELT decoder */ /* 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; 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->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND)
{ {
if (st->bandwidth == BANDWIDTH_SUPERWIDEBAND) int endband;
celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(20));
else switch(st->bandwidth)
celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(21)); {
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 */ /* Encode high band with CELT */
celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm_celt, frame_size, &dec); celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm_celt, frame_size, &dec);
for (i=0;i<frame_size;i++) 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) void opus_decoder_destroy(OpusDecoder *st)
{ {
celt_mode_destroy(st->celt_mode);
free(st); free(st);
} }

View file

@ -36,7 +36,6 @@
#include "opus.h" #include "opus.h"
struct OpusDecoder { struct OpusDecoder {
CELTMode *celt_mode;
CELTDecoder *celt_dec; CELTDecoder *celt_dec;
void *silk_dec; void *silk_dec;

View file

@ -44,27 +44,22 @@
OpusEncoder *opus_encoder_create(int Fs) OpusEncoder *opus_encoder_create(int Fs)
{ {
char *raw_state; char *raw_state;
CELTMode *celtMode;
OpusEncoder *st; OpusEncoder *st;
int ret, silkEncSizeBytes, celtEncSizeBytes; int ret, silkEncSizeBytes, celtEncSizeBytes;
SKP_SILK_SDK_EncControlStruct encControl; 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 */ /* Create SILK encoder */
ret = SKP_Silk_SDK_Get_Encoder_Size( &silkEncSizeBytes ); ret = SKP_Silk_SDK_Get_Encoder_Size( &silkEncSizeBytes );
if( ret ) { if( ret ) {
/* Handle error */ /* Handle error */
} }
celtEncSizeBytes = celt_encoder_get_size(celtMode, 1); celtEncSizeBytes = celt_encoder_get_size(1);
raw_state = calloc(sizeof(OpusEncoder)+silkEncSizeBytes+celtEncSizeBytes, 1); raw_state = calloc(sizeof(OpusEncoder)+silkEncSizeBytes+celtEncSizeBytes, 1);
st = (OpusEncoder*)raw_state; st = (OpusEncoder*)raw_state;
st->silk_enc = (void*)(raw_state+sizeof(OpusEncoder)); st->silk_enc = (void*)(raw_state+sizeof(OpusEncoder));
st->celt_enc = (CELTEncoder*)(raw_state+sizeof(OpusEncoder)+silkEncSizeBytes); st->celt_enc = (CELTEncoder*)(raw_state+sizeof(OpusEncoder)+silkEncSizeBytes);
st->Fs = Fs; st->Fs = Fs;
st->celt_mode = celtMode;
/*encControl.API_sampleRate = st->Fs; /*encControl.API_sampleRate = st->Fs;
encControl.packetLossPercentage = 0; encControl.packetLossPercentage = 0;
@ -78,7 +73,7 @@ OpusEncoder *opus_encoder_create(int Fs)
/* Create CELT encoder */ /* Create CELT encoder */
/* Initialize 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->mode = MODE_HYBRID;
st->bandwidth = BANDWIDTH_FULLBAND; 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) if (st->Fs == 100 * frame_size)
encControl.bitRate -= 5000; encControl.bitRate -= 5000;
} }
encControl.payloadSize_ms = 1000 * frame_size / st->Fs; encControl.payloadSize_ms = 1000 * frame_size / st->Fs;
if (st->mode == MODE_HYBRID) if (st->mode == MODE_HYBRID)
encControl.minInternalSampleRate = 16000; encControl.minInternalSampleRate = 16000;
else else
encControl.minInternalSampleRate = 8000; encControl.minInternalSampleRate = 8000;
if (st->bandwidth == BANDWIDTH_NARROWBAND) if (st->bandwidth == BANDWIDTH_NARROWBAND)
encControl.maxInternalSampleRate = 8000; encControl.maxInternalSampleRate = 8000;
else if (st->bandwidth == BANDWIDTH_MEDIUMBAND) else if (st->bandwidth == BANDWIDTH_MEDIUMBAND)
encControl.maxInternalSampleRate = 12000; encControl.maxInternalSampleRate = 12000;
else else
encControl.maxInternalSampleRate = 16000; encControl.maxInternalSampleRate = 16000;
/* Call SILK encoder for the low band */ /* Call SILK encoder for the low band */
nBytes = bytes_per_packet; 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) if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND)
{ {
int endband;
short pcm_buf[960]; short pcm_buf[960];
if (st->bandwidth == BANDWIDTH_SUPERWIDEBAND) switch(st->bandwidth)
celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(20)); {
else case BANDWIDTH_NARROWBAND:
celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(21)); 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++) for (i=0;i<ENCODER_DELAY_COMPENSATION;i++)
pcm_buf[i] = st->delay_buffer[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) void opus_encoder_destroy(OpusEncoder *st)
{ {
celt_mode_destroy(st->celt_mode);
free(st); free(st);
} }

View file

@ -40,7 +40,6 @@
#define ENCODER_DELAY_COMPENSATION 130 #define ENCODER_DELAY_COMPENSATION 130
struct OpusEncoder { struct OpusEncoder {
CELTMode *celt_mode;
CELTEncoder *celt_enc; CELTEncoder *celt_enc;
void *silk_enc; void *silk_enc;