Updated to CELT's new API
This commit is contained in:
parent
3c8bd3ffc7
commit
e6f53b7303
6 changed files with 49 additions and 36 deletions
2
celt
2
celt
|
@ -1 +1 @@
|
||||||
Subproject commit 620e716b764eb643e0a376f64f55448ad9447eb2
|
Subproject commit 8cf29f0991bea7460adbd90fd39d95328b9a3065
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue