Adds opus_{en|de}coder_init() and opus_{en|de|coder_get_size()

This commit is contained in:
Jean-Marc Valin 2011-05-05 20:47:42 -04:00
parent 5095c47053
commit 280c060bb1
3 changed files with 98 additions and 39 deletions

View file

@ -29,6 +29,7 @@
#include "config.h"
#endif
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
@ -54,27 +55,42 @@ static const int audio_bandwidth_thresholds[10] = {
33000, 2000, /* SWB<->FB */
};
/* Make sure everything's aligned to 4 bytes (this may need to be increased
on really weird architectures) */
static inline int align(int i)
{
return (i+3)&-4;
}
OpusEncoder *opus_encoder_create(int Fs, int channels)
int opus_encoder_get_size(int channels)
{
int silkEncSizeBytes, celtEncSizeBytes;
int ret;
ret = SKP_Silk_SDK_Get_Encoder_Size( &silkEncSizeBytes );
if(ret)
return 0;
silkEncSizeBytes = align(silkEncSizeBytes);
celtEncSizeBytes = celt_encoder_get_size(channels);
return align(sizeof(OpusEncoder))+silkEncSizeBytes+celtEncSizeBytes;
}
OpusEncoder *opus_encoder_init(OpusEncoder* st, int Fs, int channels)
{
void *silk_enc;
CELTEncoder *celt_enc;
int err;
char *raw_state;
OpusEncoder *st;
int ret, silkEncSizeBytes, celtEncSizeBytes;
memset(st, 0, sizeof(OpusEncoder));
/* Create SILK encoder */
ret = SKP_Silk_SDK_Get_Encoder_Size( &silkEncSizeBytes );
if( ret )
return NULL;
silkEncSizeBytes = align(silkEncSizeBytes);
celtEncSizeBytes = celt_encoder_get_size(channels);
raw_state = calloc(sizeof(OpusEncoder)+silkEncSizeBytes+celtEncSizeBytes, 1);
if (raw_state == NULL)
return NULL;
st = (OpusEncoder*)raw_state;
st->silk_enc_offset = sizeof(OpusEncoder);
st->celt_enc_offset = sizeof(OpusEncoder)+silkEncSizeBytes;
st->silk_enc_offset = align(sizeof(OpusEncoder));
st->celt_enc_offset = st->silk_enc_offset+silkEncSizeBytes;
silk_enc = (char*)st+st->silk_enc_offset;
celt_enc = (CELTEncoder*)((char*)st+st->celt_enc_offset);
@ -123,6 +139,14 @@ failure:
return NULL;
}
OpusEncoder *opus_encoder_create(int Fs, int channels)
{
char *raw_state = malloc(opus_encoder_get_size(channels));
if (raw_state == NULL)
return NULL;
return opus_encoder_init((OpusEncoder*)raw_state, Fs, channels);
}
int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
unsigned char *data, int max_data_bytes)
{