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:22:43 +0400
committerJean-Marc Valin <jean-marc.valin@octasic.com>2010-08-31 19:22:43 +0400
commitbcdfe6340aa3865d32c01100f54ae5297eea5066 (patch)
tree11bbc26745940ffcd762efad2400c4fa9be1fb12 /src
parent4e47ad57edd15435a7e8c36c9e3a9c96bd0a54a7 (diff)
Hybrid encoder now allocates only one block of memory
Diffstat (limited to 'src')
-rw-r--r--src/hybrid_encoder.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/hybrid_encoder.c b/src/hybrid_encoder.c
index 2761327d..ae51d5ec 100644
--- a/src/hybrid_encoder.c
+++ b/src/hybrid_encoder.c
@@ -43,20 +43,28 @@
HybridEncoder *hybrid_encoder_create(int Fs)
{
+ char *raw_state;
+ CELTMode *celtMode;
HybridEncoder *st;
- int ret, encSizeBytes;
+ int ret, silkEncSizeBytes, celtEncSizeBytes;
SKP_SILK_SDK_EncControlStruct encControl;
- st = calloc(sizeof(HybridEncoder), 1);
-
- st->Fs = Fs;
+ /* We should not have to create a CELT mode for each encoder state */
+ celtMode = celt_mode_create(Fs, Fs/50, NULL);
/* Create SILK encoder */
- ret = SKP_Silk_SDK_Get_Encoder_Size( &encSizeBytes );
+ ret = SKP_Silk_SDK_Get_Encoder_Size( &silkEncSizeBytes );
+ celtEncSizeBytes = celt_encoder_get_size(celtMode, 1);
if( ret ) {
/* Handle error */
}
- st->silk_enc = malloc(encSizeBytes);
+ raw_state = calloc(sizeof(HybridEncoder)+silkEncSizeBytes+celtEncSizeBytes, 1);
+ st = (HybridEncoder*)raw_state;
+ st->silk_enc = (void*)(raw_state+sizeof(HybridEncoder));
+ st->celt_enc = (CELTEncoder*)(raw_state+sizeof(HybridEncoder)+silkEncSizeBytes);
+
+ st->Fs = Fs;
+ st->celt_mode = celtMode;
/*encControl.API_sampleRate = st->Fs;
encControl.packetLossPercentage = 0;
@@ -69,10 +77,8 @@ HybridEncoder *hybrid_encoder_create(int Fs)
}
/* Create CELT encoder */
- /* 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_enc = celt_encoder_create(st->celt_mode, 1, NULL);
+ st->celt_enc = celt_encoder_init(st->celt_enc, st->celt_mode, 1, NULL);
st->mode = MODE_HYBRID;
st->bandwidth = BANDWIDTH_FULLBAND;
@@ -226,11 +232,7 @@ void hybrid_encoder_ctl(HybridEncoder *st, int request, ...)
void hybrid_encoder_destroy(HybridEncoder *st)
{
- free(st->silk_enc);
-
- celt_encoder_destroy(st->celt_enc);
celt_mode_destroy(st->celt_mode);
-
free(st);
}