From 67008d23cd569595409703b8341533e8ced01baf Mon Sep 17 00:00:00 2001
From: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date: Tue, 20 Jul 2010 11:13:30 -0400
Subject: [PATCH] Support for setting the audio bandwidth

---
 celt                 |  2 +-
 src/hybrid.h         |  7 ++++---
 src/hybrid_decoder.c |  9 ++++++++-
 src/hybrid_encoder.c | 15 ++++++++++++++-
 4 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/celt b/celt
index b1e017f58..6bf3b0a7a 160000
--- a/celt
+++ b/celt
@@ -1 +1 @@
-Subproject commit b1e017f58d2bb319eb7bc3305048185a9c8fe9d9
+Subproject commit 6bf3b0a7a13e469d4a2e161143a240220f563150
diff --git a/src/hybrid.h b/src/hybrid.h
index ae1566dab..541fca168 100644
--- a/src/hybrid.h
+++ b/src/hybrid.h
@@ -52,9 +52,10 @@ extern "C" {
 #define MODE_CELT_ONLY 1002
 
 #define BANDWIDTH_NARROWBAND    1100
-#define BANDWIDTH_WIDEBAND      1101
-#define BANDWIDTH_SUPERWIDEBAND 1102
-#define BANDWIDTH_FULLBAND      1103
+#define BANDWIDTH_MEDIUMBAND    1101
+#define BANDWIDTH_WIDEBAND      1102
+#define BANDWIDTH_SUPERWIDEBAND 1103
+#define BANDWIDTH_FULLBAND      1104
 
 
 
diff --git a/src/hybrid_decoder.c b/src/hybrid_decoder.c
index 8eab5c907..8425350a5 100644
--- a/src/hybrid_decoder.c
+++ b/src/hybrid_decoder.c
@@ -88,6 +88,9 @@ int hybrid_decode(HybridDecoder *st, const unsigned char *data,
     if (st->mode != MODE_CELT_ONLY)
     {
         DecControl.API_sampleRate = st->Fs;
+
+        /* We Should eventually have to set the bandwidth here */
+
         /* 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)
@@ -108,8 +111,12 @@ int hybrid_decode(HybridDecoder *st, const unsigned char *data,
         celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(0));
     }
 
-    if (st->mode != MODE_SILK_ONLY)
+    if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND)
     {
+        if (st->bandwidth == BANDWIDTH_SUPERWIDEBAND)
+            celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(20));
+        else
+            celt_decoder_ctl(st->celt_dec, CELT_SET_END_BAND(21));
         /* Encode high band with CELT */
         celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm_celt, frame_size, &dec);
         for (i=0;i<frame_size;i++)
diff --git a/src/hybrid_encoder.c b/src/hybrid_encoder.c
index 413f08b22..2acf3eb5e 100644
--- a/src/hybrid_encoder.c
+++ b/src/hybrid_encoder.c
@@ -103,6 +103,14 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size,
 	    if (st->Fs / frame_size == 100)
 	        st->encControl.bitRate += 5000;
 	    st->encControl.packetSize = frame_size;
+
+	    if (st->bandwidth == BANDWIDTH_NARROWBAND)
+	        st->encControl.maxInternalSampleRate = 8000;
+	    else if (st->bandwidth == BANDWIDTH_MEDIUMBAND)
+            st->encControl.maxInternalSampleRate = 12000;
+	    else
+	        st->encControl.maxInternalSampleRate = 16000;
+
 	    /* Call SILK encoder for the low band */
 	    nBytes = bytes_per_packet;
 	    ret = SKP_Silk_SDK_Encode( st->silk_enc, &st->encControl, pcm, frame_size, &enc, &nBytes );
@@ -121,10 +129,15 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size,
         celt_encoder_ctl(st->celt_enc, CELT_SET_START_BAND(0));
 	}
 
-	if (st->mode != MODE_SILK_ONLY)
+	if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND)
 	{
 	    short buf[960];
 
+        if (st->bandwidth == BANDWIDTH_SUPERWIDEBAND)
+            celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(20));
+        else
+            celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(21));
+
 	    for (i=0;i<ENCODER_DELAY_COMPENSATION;i++)
 	        buf[i] = st->delay_buffer[i];
         for (;i<frame_size;i++)
-- 
GitLab