Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.xiph.org/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Marc Valin <jean-marc.valin@octasic.com>2010-08-31 19:31:54 +0400
committerJean-Marc Valin <jean-marc.valin@octasic.com>2010-08-31 19:31:54 +0400
commit2e8a55cc074d8ac28b0dafa93208980678d77028 (patch)
treef39fce502f8ba607db35995e2355a8702d228322 /src
parentbcdfe6340aa3865d32c01100f54ae5297eea5066 (diff)
Hybrid decoder also in a single block of memory
Diffstat (limited to 'src')
-rw-r--r--src/hybrid_decoder.c28
-rw-r--r--src/hybrid_encoder.c2
2 files changed, 17 insertions, 13 deletions
diff --git a/src/hybrid_decoder.c b/src/hybrid_decoder.c
index c733369d..d76f43a5 100644
--- a/src/hybrid_decoder.c
+++ b/src/hybrid_decoder.c
@@ -44,19 +44,27 @@
HybridDecoder *hybrid_decoder_create(int Fs)
{
- int ret, decSizeBytes;
+ char *raw_state;
+ int ret, silkDecSizeBytes, celtDecSizeBytes;
+ CELTMode *celtMode;
HybridDecoder *st;
- st = malloc(sizeof(HybridDecoder));
-
- st->Fs = Fs;
+ /* 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( &decSizeBytes );
+ ret = SKP_Silk_SDK_Get_Decoder_Size( &silkDecSizeBytes );
if( ret ) {
/* Handle error */
}
- st->silk_dec = malloc( decSizeBytes );
+ celtDecSizeBytes = celt_decoder_get_size(celtMode, 1);
+ raw_state = calloc(sizeof(HybridDecoder)+silkDecSizeBytes+celtDecSizeBytes, 1);
+ st = (HybridDecoder*)raw_state;
+ st->silk_dec = (void*)(raw_state+sizeof(HybridDecoder));
+ st->celt_dec = (CELTDecoder*)(raw_state+sizeof(HybridDecoder)+silkDecSizeBytes);
+
+ st->Fs = Fs;
+ st->celt_mode = celtMode;
/* Reset decoder */
ret = SKP_Silk_SDK_InitDecoder( st->silk_dec );
@@ -64,10 +72,8 @@ HybridDecoder *hybrid_decoder_create(int Fs)
/* Handle error */
}
- /* We should not have to create a CELT mode for each encoder state */
- st->celt_mode = celt_mode_create(Fs, Fs/50, NULL);
- /* Initialize CELT encoder */
- st->celt_dec = celt_decoder_create(st->celt_mode, 1, NULL);
+ /* Initialize CELT decoder */
+ st->celt_dec = celt_decoder_init(st->celt_dec, st->celt_mode, 1, NULL);
return st;
@@ -171,8 +177,6 @@ void hybrid_decoder_ctl(HybridDecoder *st, int request, ...)
void hybrid_decoder_destroy(HybridDecoder *st)
{
- free(st->silk_dec);
- celt_decoder_destroy(st->celt_dec);
celt_mode_destroy(st->celt_mode);
free(st);
diff --git a/src/hybrid_encoder.c b/src/hybrid_encoder.c
index ae51d5ec..5289d8f3 100644
--- a/src/hybrid_encoder.c
+++ b/src/hybrid_encoder.c
@@ -54,10 +54,10 @@ HybridEncoder *hybrid_encoder_create(int Fs)
/* Create SILK encoder */
ret = SKP_Silk_SDK_Get_Encoder_Size( &silkEncSizeBytes );
- celtEncSizeBytes = celt_encoder_get_size(celtMode, 1);
if( ret ) {
/* Handle error */
}
+ celtEncSizeBytes = celt_encoder_get_size(celtMode, 1);
raw_state = calloc(sizeof(HybridEncoder)+silkEncSizeBytes+celtEncSizeBytes, 1);
st = (HybridEncoder*)raw_state;
st->silk_enc = (void*)(raw_state+sizeof(HybridEncoder));