Implements desiredInternalSampleRate
authorKoen Vos <koen.vos@skype.net>
Wed, 27 Apr 2011 12:22:24 +0000 (08:22 -0400)
committerJean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Wed, 27 Apr 2011 12:22:24 +0000 (08:22 -0400)
interface/SKP_Silk_control.h
src_common/SKP_Silk_check_control_input.c
src_common/SKP_Silk_control_audio_bandwidth.c
src_common/SKP_Silk_control_codec.c
src_common/SKP_Silk_enc_API.c
src_common/SKP_Silk_main.h
src_common/SKP_Silk_structs.h
src_common/SKP_Silk_tuning_parameters.h

index 6d81af0..7c8db28 100644 (file)
@@ -56,6 +56,9 @@ typedef struct {
     /* I:   Minimum internal sampling rate in Hertz; 8000/12000/16000                       */\r
     SKP_int32 minInternalSampleRate;\r
 \r
+    /* I:   Soft request for internal sampling rate in Hertz; 8000/12000/16000              */\r
+    SKP_int32 desiredInternalSampleRate;\r
+\r
     /* I:   Number of samples per packet in milliseconds; 10/20/40/60                       */\r
     SKP_int payloadSize_ms;\r
 \r
index cbdafc6..0ddf7fa 100644 (file)
@@ -36,19 +36,24 @@ SKP_int check_control_input(
 {\r
     SKP_assert( encControl != NULL );\r
 \r
-    if( ( ( encControl->API_sampleRate        !=  8000 ) &&\r
-          ( encControl->API_sampleRate        != 12000 ) &&\r
-          ( encControl->API_sampleRate        != 16000 ) &&\r
-          ( encControl->API_sampleRate        != 24000 ) && \r
-          ( encControl->API_sampleRate        != 32000 ) &&\r
-          ( encControl->API_sampleRate        != 44100 ) &&\r
-          ( encControl->API_sampleRate        != 48000 ) ) ||\r
-        ( ( encControl->maxInternalSampleRate !=  8000 ) &&\r
-          ( encControl->maxInternalSampleRate != 12000 ) &&\r
-          ( encControl->maxInternalSampleRate != 16000 ) ) ||\r
-        ( ( encControl->minInternalSampleRate !=  8000 ) &&\r
-          ( encControl->minInternalSampleRate != 12000 ) &&\r
-          ( encControl->minInternalSampleRate != 16000 ) ) ||\r
+    if( ( ( encControl->API_sampleRate            !=  8000 ) &&\r
+          ( encControl->API_sampleRate            != 12000 ) &&\r
+          ( encControl->API_sampleRate            != 16000 ) &&\r
+          ( encControl->API_sampleRate            != 24000 ) && \r
+          ( encControl->API_sampleRate            != 32000 ) &&\r
+          ( encControl->API_sampleRate            != 44100 ) &&\r
+          ( encControl->API_sampleRate            != 48000 ) ) ||\r
+        ( ( encControl->desiredInternalSampleRate !=  8000 ) &&\r
+          ( encControl->desiredInternalSampleRate != 12000 ) &&\r
+          ( encControl->desiredInternalSampleRate != 16000 ) ) ||\r
+        ( ( encControl->maxInternalSampleRate     !=  8000 ) &&\r
+          ( encControl->maxInternalSampleRate     != 12000 ) &&\r
+          ( encControl->maxInternalSampleRate     != 16000 ) ) ||\r
+        ( ( encControl->minInternalSampleRate     !=  8000 ) &&\r
+          ( encControl->minInternalSampleRate     != 12000 ) &&\r
+          ( encControl->minInternalSampleRate     != 16000 ) ) ||\r
+          ( encControl->minInternalSampleRate > encControl->desiredInternalSampleRate ) ||\r
+          ( encControl->maxInternalSampleRate < encControl->desiredInternalSampleRate ) ||\r
           ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) {\r
         SKP_assert( 0 );\r
         return SKP_SILK_ENC_FS_NOT_SUPPORTED;\r
index 20a1eea..0e454c3 100644 (file)
@@ -30,46 +30,29 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 /* Control internal sampling rate */\r
 SKP_int SKP_Silk_control_audio_bandwidth(\r
-    SKP_Silk_encoder_state      *psEncC,            /* I/O  Pointer to Silk encoder state               */\r
-    SKP_int32                   TargetRate_bps      /* I    Target max bitrate (bps)                    */\r
+    SKP_Silk_encoder_state      *psEncC             /* I/O  Pointer to Silk encoder state               */\r
 )\r
 {\r
     SKP_int   fs_kHz;\r
     SKP_int32 fs_Hz;\r
     \r
-    /* Reduce bitrate for 10 ms modes in these calculations */\r
-    if( psEncC->nb_subfr == 2 ) {\r
-        TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS;\r
-    }\r
-\r
     fs_kHz = psEncC->fs_kHz;\r
     fs_Hz = SKP_SMULBB( fs_kHz, 1000 );\r
     if( fs_Hz == 0 ) {\r
         /* Encoder has just been initialized */\r
-        if( TargetRate_bps >= WB2MB_BITRATE_BPS ) {\r
-            fs_Hz = 16000;\r
-        } else if( TargetRate_bps >= MB2NB_BITRATE_BPS ) {\r
-            fs_Hz = 12000;\r
-        } else {\r
-            fs_Hz = 8000;\r
-        }\r
-        /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */\r
-        fs_Hz = SKP_min( fs_Hz, psEncC->API_fs_Hz );\r
-        fs_Hz = SKP_min( fs_Hz, psEncC->maxInternal_fs_Hz );\r
-        fs_Hz = SKP_max( fs_Hz, psEncC->minInternal_fs_Hz );\r
+        fs_Hz  = SKP_min( psEncC->desiredInternal_fs_Hz, psEncC->API_fs_Hz );\r
         fs_kHz = SKP_DIV32_16( fs_Hz, 1000 );\r
     } else if( fs_Hz > psEncC->API_fs_Hz || fs_Hz > psEncC->maxInternal_fs_Hz || fs_Hz < psEncC->minInternal_fs_Hz ) {\r
         /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */\r
-        fs_Hz = psEncC->API_fs_Hz;\r
-        fs_Hz = SKP_min( fs_Hz, psEncC->maxInternal_fs_Hz );\r
-        fs_Hz = SKP_max( fs_Hz, psEncC->minInternal_fs_Hz );\r
+        fs_Hz  = psEncC->API_fs_Hz;\r
+        fs_Hz  = SKP_min( fs_Hz, psEncC->maxInternal_fs_Hz );\r
+        fs_Hz  = SKP_max( fs_Hz, psEncC->minInternal_fs_Hz );\r
         fs_kHz = SKP_DIV32_16( fs_Hz, 1000 );\r
     } else {\r
         /* State machine for the internal sampling rate switching */\r
         if( psEncC->API_fs_Hz > 8000 && psEncC->prevSignalType == TYPE_NO_VOICE_ACTIVITY ) {\r
             /* Check if we should switch down */\r
-            if( ( psEncC->fs_kHz == 12 && TargetRate_bps < MB2NB_BITRATE_BPS && psEncC->minInternal_fs_Hz <=  8000 ) ||\r
-                ( psEncC->fs_kHz == 16 && TargetRate_bps < WB2MB_BITRATE_BPS && psEncC->minInternal_fs_Hz <= 12000 ) ) \r
+            if( SKP_SMULBB( psEncC->fs_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) \r
             {\r
                 /* Switch down */\r
                 if( psEncC->sLP.mode == 0 ) {\r
@@ -91,8 +74,8 @@ SKP_int SKP_Silk_control_audio_bandwidth(
                 } \r
             } \r
             else\r
-            if( ( psEncC->fs_kHz ==  8 && TargetRate_bps > NB2MB_BITRATE_BPS && psEncC->maxInternal_fs_Hz >= 12000 && psEncC->API_fs_Hz >= 12000 ) ||\r
-                ( psEncC->fs_kHz == 12 && TargetRate_bps > MB2WB_BITRATE_BPS && psEncC->maxInternal_fs_Hz >= 16000 && psEncC->API_fs_Hz >= 16000 ) ) \r
+            /* Check if we should switch up */\r
+            if( SKP_SMULBB( psEncC->fs_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz ) \r
             {\r
                 /* Switch up */\r
                 if( psEncC->sLP.mode == 0 ) {\r
index c497e19..00b4cc5 100644 (file)
@@ -50,7 +50,7 @@ SKP_int SKP_Silk_setup_complexity(
     SKP_int                         Complexity          /* I                        */\r
 );\r
 \r
-static SKP_int SKP_Silk_setup_LBRR(\r
+SKP_INLINE SKP_int SKP_Silk_setup_LBRR(\r
     SKP_Silk_encoder_state          *psEncC,            /* I/O                      */\r
     const SKP_int32                 TargetRate_bps      /* I                        */\r
 );\r
@@ -65,12 +65,13 @@ SKP_int SKP_Silk_control_encoder(
 {\r
     SKP_int   fs_kHz, ret = 0;\r
 \r
-    psEnc->sCmn.useDTX            = encControl->useDTX;\r
-    psEnc->sCmn.useCBR            = encControl->useCBR;\r
-    psEnc->sCmn.API_fs_Hz         = encControl->API_sampleRate;\r
-    psEnc->sCmn.maxInternal_fs_Hz = encControl->maxInternalSampleRate;\r
-    psEnc->sCmn.minInternal_fs_Hz = encControl->minInternalSampleRate;\r
-    psEnc->sCmn.useInBandFEC      = encControl->useInBandFEC;\r
+    psEnc->sCmn.useDTX                = encControl->useDTX;\r
+    psEnc->sCmn.useCBR                = encControl->useCBR;\r
+    psEnc->sCmn.API_fs_Hz             = encControl->API_sampleRate;\r
+    psEnc->sCmn.maxInternal_fs_Hz     = encControl->maxInternalSampleRate;\r
+    psEnc->sCmn.minInternal_fs_Hz     = encControl->minInternalSampleRate;\r
+    psEnc->sCmn.desiredInternal_fs_Hz = encControl->desiredInternalSampleRate;\r
+    psEnc->sCmn.useInBandFEC          = encControl->useInBandFEC;\r
 \r
     if( psEnc->sCmn.controlled_since_last_payload != 0 && psEnc->sCmn.prefillFlag == 0 ) {\r
         if( psEnc->sCmn.API_fs_Hz != psEnc->sCmn.prev_API_fs_Hz && psEnc->sCmn.fs_kHz > 0 ) {\r
@@ -85,7 +86,7 @@ SKP_int SKP_Silk_control_encoder(
     /********************************************/\r
     /* Determine internal sampling rate         */\r
     /********************************************/\r
-    fs_kHz = SKP_Silk_control_audio_bandwidth( &psEnc->sCmn, TargetRate_bps );\r
+    fs_kHz = SKP_Silk_control_audio_bandwidth( &psEnc->sCmn );\r
 \r
     /********************************************/\r
     /* Prepare resampler and buffered data      */\r
index 71dd5e9..b2619a8 100644 (file)
@@ -107,17 +107,18 @@ SKP_int SKP_Silk_SDK_QueryEncoder(
 \r
     state_Fxx = ((SKP_Silk_encoder *)encState)->state_Fxx;\r
 \r
-    encStatus->API_sampleRate        = state_Fxx->sCmn.API_fs_Hz;\r
-    encStatus->maxInternalSampleRate = state_Fxx->sCmn.maxInternal_fs_Hz;\r
-    encStatus->minInternalSampleRate = state_Fxx->sCmn.minInternal_fs_Hz;\r
-    encStatus->payloadSize_ms        = state_Fxx->sCmn.PacketSize_ms;\r
-    encStatus->bitRate               = state_Fxx->sCmn.TargetRate_bps;\r
-    encStatus->packetLossPercentage  = state_Fxx->sCmn.PacketLoss_perc;\r
-    encStatus->complexity            = state_Fxx->sCmn.Complexity;\r
-    encStatus->useInBandFEC          = state_Fxx->sCmn.useInBandFEC;\r
-    encStatus->useDTX                = state_Fxx->sCmn.useDTX;\r
-    encStatus->useCBR                = state_Fxx->sCmn.useCBR;\r
-    encStatus->internalSampleRate    = SKP_SMULBB( state_Fxx->sCmn.fs_kHz, 1000 );\r
+    encStatus->API_sampleRate            = state_Fxx->sCmn.API_fs_Hz;\r
+    encStatus->maxInternalSampleRate     = state_Fxx->sCmn.maxInternal_fs_Hz;\r
+    encStatus->minInternalSampleRate     = state_Fxx->sCmn.minInternal_fs_Hz;\r
+    encStatus->desiredInternalSampleRate = state_Fxx->sCmn.desiredInternal_fs_Hz;\r
+    encStatus->payloadSize_ms            = state_Fxx->sCmn.PacketSize_ms;\r
+    encStatus->bitRate                   = state_Fxx->sCmn.TargetRate_bps;\r
+    encStatus->packetLossPercentage      = state_Fxx->sCmn.PacketLoss_perc;\r
+    encStatus->complexity                = state_Fxx->sCmn.Complexity;\r
+    encStatus->useInBandFEC              = state_Fxx->sCmn.useInBandFEC;\r
+    encStatus->useDTX                    = state_Fxx->sCmn.useDTX;\r
+    encStatus->useCBR                    = state_Fxx->sCmn.useCBR;\r
+    encStatus->internalSampleRate        = SKP_SMULBB( state_Fxx->sCmn.fs_kHz, 1000 );\r
 \r
     return ret;\r
 }\r
index f8de3ea..3aff2df 100644 (file)
@@ -97,8 +97,7 @@ SKP_int check_control_input(
 \r
 /* Control internal sampling rate */\r
 SKP_int SKP_Silk_control_audio_bandwidth(\r
-    SKP_Silk_encoder_state      *psEncC,            /* I/O  Pointer to Silk encoder state               */\r
-    SKP_int32                   TargetRate_bps      /* I    Target max bitrate (bps)                    */\r
+    SKP_Silk_encoder_state      *psEncC             /* I/O  Pointer to Silk encoder state               */\r
 );\r
 \r
 /* Control SNR of redidual quantizer */\r
index cbceaee..a3b1519 100644 (file)
@@ -28,9 +28,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #ifndef SKP_SILK_STRUCTS_H\r
 #define SKP_SILK_STRUCTS_H\r
 \r
-#ifdef HAVE_CONFIG_H\r
-#include "config.h"\r
-#endif\r
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 \r
 #include "SKP_Silk_typedef.h"\r
 #include "SKP_Silk_SigProc_FIX.h"\r
@@ -137,6 +137,7 @@ typedef struct {
     SKP_int32                       prev_API_fs_Hz;                 /* Previous API sampling frequency (Hz)                                 */\r
     SKP_int                         maxInternal_fs_Hz;              /* Maximum internal sampling frequency (Hz)                             */\r
     SKP_int                         minInternal_fs_Hz;              /* Minimum internal sampling frequency (Hz)                             */\r
+    SKP_int                         desiredInternal_fs_Hz;          /* Soft request for internal sampling frequency (Hz)                    */\r
     SKP_int                         fs_kHz;                         /* Internal sampling frequency (kHz)                                    */\r
     SKP_int                         nb_subfr;                       /* Number of 5 ms subframes in a frame                                  */\r
     SKP_int                         frame_length;                   /* Frame length (samples)                                               */\r
index a26fd7f..c5d8d41 100644 (file)
@@ -159,12 +159,6 @@ extern "C"
 /* Compensation in bitrate calculations for 10 ms modes */\r
 #define REDUCE_BITRATE_10_MS_BPS                        2200\r
 \r
-/* Transition bitrates between modes */\r
-#define WB2MB_BITRATE_BPS                               12600\r
-#define MB2WB_BITRATE_BPS                               15600\r
-#define MB2NB_BITRATE_BPS                               9600\r
-#define NB2MB_BITRATE_BPS                               12600\r
-\r
 #ifdef __cplusplus\r
 }\r
 #endif\r