Hybrid mode tuning
authorKarsten Vandborg Sorensen <karsten.vandborg.sorensen@skype.net>
Thu, 3 Feb 2011 14:36:59 +0000 (09:36 -0500)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Thu, 3 Feb 2011 14:36:59 +0000 (09:36 -0500)
celt
src/opus_encoder.c

diff --git a/celt b/celt
index 9a7540b..ff4116c 160000 (submodule)
--- a/celt
+++ b/celt
@@ -1 +1 @@
-Subproject commit 9a7540b673ccd96dbfb0ee3f8ce41efd76a88d33
+Subproject commit ff4116ccb5e771c84c8963c954a595407a95391e
index a6fda2e..28317b9 100644 (file)
@@ -107,13 +107,26 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
        ec_enc_init(&enc,&buf);
 
        /* SILK processing */
-    if (st->mode != MODE_CELT_ONLY)
-    {
+    if (st->mode != MODE_CELT_ONLY) {
         st->silk_mode.bitRate = st->bitrate_bps - 8*st->Fs/frame_size;
         if( st->mode == MODE_HYBRID ) {
-            /* FIXME: Tune this offset */
-            st->silk_mode.bitRate = (st->silk_mode.bitRate + 12000) / 2;
-            /* FIXME: Adjust for 10 ms frames */
+            if( st->bandwidth == BANDWIDTH_SUPERWIDEBAND ) {
+                if( st->Fs == 100 * frame_size ) {
+                    /* 24 kHz, 10 ms */
+                    st->silk_mode.bitRate = ( ( st->silk_mode.bitRate + 14000 ) * 2 ) / 3;
+                } else {
+                    /* 24 kHz, 20 ms */
+                    st->silk_mode.bitRate = ( ( st->silk_mode.bitRate + 10000 ) * 2 ) / 3;
+                }
+            } else {
+                if( st->Fs == 100 * frame_size ) {
+                    /* 48 kHz, 10 ms */
+                    st->silk_mode.bitRate = ( st->silk_mode.bitRate + 18000 ) / 2;
+                } else {
+                    /* 48 kHz, 20 ms */
+                    st->silk_mode.bitRate = ( st->silk_mode.bitRate + 16000 ) / 2;
+                }
+            }
         }
 
         st->silk_mode.payloadSize_ms = 1000 * frame_size / st->Fs;