diff --git a/src/hybrid_decoder.c b/src/hybrid_decoder.c index 05928b69d180a972abf0eedd9bf4ff5b3b5fb314..2c0885bc137cbfdd3c87114468641db8fad1128c 100644 --- a/src/hybrid_decoder.c +++ b/src/hybrid_decoder.c @@ -37,16 +37,28 @@ #include "hybrid_decoder.h" #include "celt/libcelt/entdec.h" #include "celt/libcelt/modes.h" +#include "SKP_Silk_SDK_API.h" HybridDecoder *hybrid_decoder_create() { + int ret, decSizeBytes; HybridDecoder *st; st = malloc(sizeof(HybridDecoder)); - /* FIXME: Initialize SILK encoder here */ - st->silk_dec = NULL; + /* Initialize SILK encoder */ + ret = SKP_Silk_SDK_Get_Decoder_Size( &decSizeBytes ); + if( ret ) { + /* Handle error */ + } + st->silk_dec = malloc( decSizeBytes ); + + /* Reset decoder */ + ret = SKP_Silk_SDK_InitDecoder( st->silk_dec ); + if( ret ) { + /* Handle error */ + } /* We should not have to create a CELT mode for each encoder state */ st->celt_mode = celt_mode_create(48000, 960, NULL); @@ -59,20 +71,31 @@ HybridDecoder *hybrid_decoder_create() int hybrid_decode(HybridDecoder *st, const unsigned char *data, int len, short *pcm, int frame_size) { - int celt_ret; + int i, silk_ret, celt_ret; ec_dec dec; ec_byte_buffer buf; + SKP_SILK_SDK_DecControlStruct DecControl; + SKP_int16 silk_frame_size; + short pcm_celt[960]; ec_byte_readinit(&buf,(unsigned char*)data,len); ec_dec_init(&dec,&buf); - /* FIXME: Call SILK encoder for the low band */ + DecControl.API_sampleRate = 48000; + /* Call SILK encoder for the low band */ + silk_ret = SKP_Silk_SDK_Decode( st->silk_dec, &DecControl, 0, &dec, len, pcm, &silk_frame_size ); + if (silk_ret) + { + /* Handle error */ + } /* This should be adjusted based on the SILK bandwidth */ celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(13)); /* Encode high band with CELT */ - celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm, frame_size, &dec); + celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm_celt, frame_size, &dec); + for (i=0;i<960;i++) + pcm[i] += pcm_celt[i]; return celt_ret; @@ -80,8 +103,7 @@ int hybrid_decode(HybridDecoder *st, const unsigned char *data, void hybrid_decoder_destroy(HybridDecoder *st) { - /* FIXME: Destroy SILK encoder state */ - + free(st->silk_dec); celt_decoder_destroy(st->celt_dec); celt_mode_destroy(st->celt_mode); diff --git a/src/hybrid_encoder.c b/src/hybrid_encoder.c index bedebd4cd272914c3d435aec5b09468b88c91c10..7644c7d441dea5a520b82011b4e3e56c735e4dbc 100644 --- a/src/hybrid_encoder.c +++ b/src/hybrid_encoder.c @@ -87,7 +87,7 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, ec_byte_writeinit_buffer(&buf, data, bytes_per_packet); ec_enc_init(&enc,&buf); - /* FIXME: Call SILK encoder for the low band */ + /* Call SILK encoder for the low band */ silk_ret = SKP_Silk_SDK_Encode( st->silk_enc, &st->encControl, pcm, 960, &enc, &nBytes ); if( silk_ret ) { /* Handle error */