From ae18090b550cb9a116712be2f9d96957d7f305f3 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jean-marc.valin@octasic.com> Date: Mon, 19 Jul 2010 11:44:36 -0400 Subject: [PATCH] Support for 32 kHz sampling rate --- celt | 2 +- src/hybrid.h | 4 ++-- src/hybrid_decoder.c | 8 +++++--- src/hybrid_decoder.h | 2 ++ src/hybrid_encoder.c | 14 +++++++++----- src/hybrid_encoder.h | 2 ++ src/test_hybrid.c | 4 ++-- 7 files changed, 23 insertions(+), 13 deletions(-) diff --git a/celt b/celt index 8952c45ea..b1e017f58 160000 --- a/celt +++ b/celt @@ -1 +1 @@ -Subproject commit 8952c45ea54a5608cd61fe2e137e39d0c3b19853 +Subproject commit b1e017f58d2bb319eb7bc3305048185a9c8fe9d9 diff --git a/src/hybrid.h b/src/hybrid.h index 94d9f063d..ae1566dab 100644 --- a/src/hybrid.h +++ b/src/hybrid.h @@ -76,7 +76,7 @@ extern "C" { typedef struct HybridEncoder HybridEncoder; typedef struct HybridDecoder HybridDecoder; -HybridEncoder *hybrid_encoder_create(); +HybridEncoder *hybrid_encoder_create(int Fs); int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, unsigned char *data, int bytes_per_packet); @@ -85,7 +85,7 @@ void hybrid_encoder_destroy(HybridEncoder *st); void hybrid_encoder_ctl(HybridEncoder *st, int request, ...); -HybridDecoder *hybrid_decoder_create(); +HybridDecoder *hybrid_decoder_create(int Fs); int hybrid_decode(HybridDecoder *st, const unsigned char *data, int len, short *pcm, int frame_size); diff --git a/src/hybrid_decoder.c b/src/hybrid_decoder.c index 2d258a449..8eab5c907 100644 --- a/src/hybrid_decoder.c +++ b/src/hybrid_decoder.c @@ -42,13 +42,15 @@ #include "SKP_Silk_SDK_API.h" -HybridDecoder *hybrid_decoder_create() +HybridDecoder *hybrid_decoder_create(int Fs) { int ret, decSizeBytes; HybridDecoder *st; st = malloc(sizeof(HybridDecoder)); + st->Fs = Fs; + /* Initialize SILK encoder */ ret = SKP_Silk_SDK_Get_Decoder_Size( &decSizeBytes ); if( ret ) { @@ -63,7 +65,7 @@ HybridDecoder *hybrid_decoder_create() } /* We should not have to create a CELT mode for each encoder state */ - st->celt_mode = celt_mode_create(48000, 960, NULL); + st->celt_mode = celt_mode_create(Fs, Fs/50, NULL); /* Initialize CELT encoder */ st->celt_dec = celt_decoder_create(st->celt_mode, 1, NULL); @@ -85,7 +87,7 @@ int hybrid_decode(HybridDecoder *st, const unsigned char *data, if (st->mode != MODE_CELT_ONLY) { - DecControl.API_sampleRate = 48000; + DecControl.API_sampleRate = st->Fs; /* 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) diff --git a/src/hybrid_decoder.h b/src/hybrid_decoder.h index eeeb0eea2..b5a54fb58 100644 --- a/src/hybrid_decoder.h +++ b/src/hybrid_decoder.h @@ -42,6 +42,8 @@ struct HybridDecoder { int mode; int bandwidth; + /* Sampling rate (at the API level) */ + int Fs; }; diff --git a/src/hybrid_encoder.c b/src/hybrid_encoder.c index b2222c16e..413f08b22 100644 --- a/src/hybrid_encoder.c +++ b/src/hybrid_encoder.c @@ -41,7 +41,7 @@ #include "modes.h" #include "SKP_Silk_SDK_API.h" -HybridEncoder *hybrid_encoder_create() +HybridEncoder *hybrid_encoder_create(int Fs) { HybridEncoder *st; int ret, encSizeBytes; @@ -59,10 +59,13 @@ HybridEncoder *hybrid_encoder_create() if( ret ) { /* Handle error */ } + + st->Fs = Fs; + /* Set Encoder parameters */ - st->encControl.API_sampleRate = 48000; + st->encControl.API_sampleRate = Fs; st->encControl.maxInternalSampleRate = 16000; - st->encControl.packetSize = 960; + st->encControl.packetSize = Fs/50; st->encControl.packetLossPercentage = 0; st->encControl.useInBandFEC = 0; st->encControl.useDTX = 0; @@ -71,7 +74,7 @@ HybridEncoder *hybrid_encoder_create() /* Create CELT encoder */ /* We should not have to create a CELT mode for each encoder state */ - st->celt_mode = celt_mode_create(48000, 960, NULL); + st->celt_mode = celt_mode_create(Fs, Fs/50, NULL); /* Initialize CELT encoder */ st->celt_enc = celt_encoder_create(st->celt_mode, 1, NULL); @@ -97,6 +100,8 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, if (st->mode != MODE_CELT_ONLY) { st->encControl.bitRate = (bytes_per_packet*50*8+6000)/2; + if (st->Fs / frame_size == 100) + st->encControl.bitRate += 5000; st->encControl.packetSize = frame_size; /* Call SILK encoder for the low band */ nBytes = bytes_per_packet; @@ -127,7 +132,6 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, celt_encoder_ctl(st->celt_enc, CELT_SET_PREDICTION(1)); /* Encode high band with CELT */ - /* FIXME: Do some delay compensation here */ ret = celt_encode_with_ec(st->celt_enc, buf, NULL, frame_size, data, bytes_per_packet, &enc); for (i=0;i<ENCODER_DELAY_COMPENSATION;i++) st->delay_buffer[i] = pcm[frame_size-ENCODER_DELAY_COMPENSATION+i]; diff --git a/src/hybrid_encoder.h b/src/hybrid_encoder.h index 0d834a541..6e4c62a8c 100644 --- a/src/hybrid_encoder.h +++ b/src/hybrid_encoder.h @@ -48,6 +48,8 @@ struct HybridEncoder { int mode; int bandwidth; int vbr_rate; + /* Sampling rate (at the API level) */ + int Fs; short delay_buffer[ENCODER_DELAY_COMPENSATION]; }; diff --git a/src/test_hybrid.c b/src/test_hybrid.c index 06ae84387..9a5af094b 100644 --- a/src/test_hybrid.c +++ b/src/test_hybrid.c @@ -94,8 +94,8 @@ int main(int argc, char *argv[]) return 1; } - enc = hybrid_encoder_create(); - dec = hybrid_decoder_create(); + enc = hybrid_encoder_create(rate); + dec = hybrid_decoder_create(rate); mode = MODE_HYBRID; hybrid_encoder_ctl(enc, HYBRID_SET_BANDWIDTH(BANDWIDTH_FULLBAND)); -- GitLab