From 34dd4c7daed31808ee81352b109affc4902a07be Mon Sep 17 00:00:00 2001 From: Koen Vos <koen.vos@skype.net> Date: Wed, 27 Apr 2011 08:22:24 -0400 Subject: [PATCH] Implements desiredInternalSampleRate --- interface/SKP_Silk_control.h | 3 ++ src_common/SKP_Silk_check_control_input.c | 31 +++++++++-------- src_common/SKP_Silk_control_audio_bandwidth.c | 33 +++++-------------- src_common/SKP_Silk_control_codec.c | 17 +++++----- src_common/SKP_Silk_enc_API.c | 23 ++++++------- src_common/SKP_Silk_main.h | 3 +- src_common/SKP_Silk_structs.h | 7 ++-- src_common/SKP_Silk_tuning_parameters.h | 6 ---- 8 files changed, 55 insertions(+), 68 deletions(-) diff --git a/interface/SKP_Silk_control.h b/interface/SKP_Silk_control.h index 6d81af07e..7c8db288f 100644 --- a/interface/SKP_Silk_control.h +++ b/interface/SKP_Silk_control.h @@ -56,6 +56,9 @@ typedef struct { /* I: Minimum internal sampling rate in Hertz; 8000/12000/16000 */ SKP_int32 minInternalSampleRate; + /* I: Soft request for internal sampling rate in Hertz; 8000/12000/16000 */ + SKP_int32 desiredInternalSampleRate; + /* I: Number of samples per packet in milliseconds; 10/20/40/60 */ SKP_int payloadSize_ms; diff --git a/src_common/SKP_Silk_check_control_input.c b/src_common/SKP_Silk_check_control_input.c index cbdafc6e2..0ddf7faea 100644 --- a/src_common/SKP_Silk_check_control_input.c +++ b/src_common/SKP_Silk_check_control_input.c @@ -36,19 +36,24 @@ SKP_int check_control_input( { SKP_assert( encControl != NULL ); - if( ( ( encControl->API_sampleRate != 8000 ) && - ( encControl->API_sampleRate != 12000 ) && - ( encControl->API_sampleRate != 16000 ) && - ( encControl->API_sampleRate != 24000 ) && - ( encControl->API_sampleRate != 32000 ) && - ( encControl->API_sampleRate != 44100 ) && - ( encControl->API_sampleRate != 48000 ) ) || - ( ( encControl->maxInternalSampleRate != 8000 ) && - ( encControl->maxInternalSampleRate != 12000 ) && - ( encControl->maxInternalSampleRate != 16000 ) ) || - ( ( encControl->minInternalSampleRate != 8000 ) && - ( encControl->minInternalSampleRate != 12000 ) && - ( encControl->minInternalSampleRate != 16000 ) ) || + if( ( ( encControl->API_sampleRate != 8000 ) && + ( encControl->API_sampleRate != 12000 ) && + ( encControl->API_sampleRate != 16000 ) && + ( encControl->API_sampleRate != 24000 ) && + ( encControl->API_sampleRate != 32000 ) && + ( encControl->API_sampleRate != 44100 ) && + ( encControl->API_sampleRate != 48000 ) ) || + ( ( encControl->desiredInternalSampleRate != 8000 ) && + ( encControl->desiredInternalSampleRate != 12000 ) && + ( encControl->desiredInternalSampleRate != 16000 ) ) || + ( ( encControl->maxInternalSampleRate != 8000 ) && + ( encControl->maxInternalSampleRate != 12000 ) && + ( encControl->maxInternalSampleRate != 16000 ) ) || + ( ( encControl->minInternalSampleRate != 8000 ) && + ( encControl->minInternalSampleRate != 12000 ) && + ( encControl->minInternalSampleRate != 16000 ) ) || + ( encControl->minInternalSampleRate > encControl->desiredInternalSampleRate ) || + ( encControl->maxInternalSampleRate < encControl->desiredInternalSampleRate ) || ( encControl->minInternalSampleRate > encControl->maxInternalSampleRate ) ) { SKP_assert( 0 ); return SKP_SILK_ENC_FS_NOT_SUPPORTED; diff --git a/src_common/SKP_Silk_control_audio_bandwidth.c b/src_common/SKP_Silk_control_audio_bandwidth.c index 20a1eead8..0e454c321 100644 --- a/src_common/SKP_Silk_control_audio_bandwidth.c +++ b/src_common/SKP_Silk_control_audio_bandwidth.c @@ -30,46 +30,29 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Control internal sampling rate */ SKP_int SKP_Silk_control_audio_bandwidth( - SKP_Silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ - SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ + SKP_Silk_encoder_state *psEncC /* I/O Pointer to Silk encoder state */ ) { SKP_int fs_kHz; SKP_int32 fs_Hz; - /* Reduce bitrate for 10 ms modes in these calculations */ - if( psEncC->nb_subfr == 2 ) { - TargetRate_bps -= REDUCE_BITRATE_10_MS_BPS; - } - fs_kHz = psEncC->fs_kHz; fs_Hz = SKP_SMULBB( fs_kHz, 1000 ); if( fs_Hz == 0 ) { /* Encoder has just been initialized */ - if( TargetRate_bps >= WB2MB_BITRATE_BPS ) { - fs_Hz = 16000; - } else if( TargetRate_bps >= MB2NB_BITRATE_BPS ) { - fs_Hz = 12000; - } else { - fs_Hz = 8000; - } - /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */ - fs_Hz = SKP_min( fs_Hz, psEncC->API_fs_Hz ); - fs_Hz = SKP_min( fs_Hz, psEncC->maxInternal_fs_Hz ); - fs_Hz = SKP_max( fs_Hz, psEncC->minInternal_fs_Hz ); + fs_Hz = SKP_min( psEncC->desiredInternal_fs_Hz, psEncC->API_fs_Hz ); fs_kHz = SKP_DIV32_16( fs_Hz, 1000 ); } else if( fs_Hz > psEncC->API_fs_Hz || fs_Hz > psEncC->maxInternal_fs_Hz || fs_Hz < psEncC->minInternal_fs_Hz ) { /* Make sure internal rate is not higher than external rate or maximum allowed, or lower than minimum allowed */ - fs_Hz = psEncC->API_fs_Hz; - fs_Hz = SKP_min( fs_Hz, psEncC->maxInternal_fs_Hz ); - fs_Hz = SKP_max( fs_Hz, psEncC->minInternal_fs_Hz ); + fs_Hz = psEncC->API_fs_Hz; + fs_Hz = SKP_min( fs_Hz, psEncC->maxInternal_fs_Hz ); + fs_Hz = SKP_max( fs_Hz, psEncC->minInternal_fs_Hz ); fs_kHz = SKP_DIV32_16( fs_Hz, 1000 ); } else { /* State machine for the internal sampling rate switching */ if( psEncC->API_fs_Hz > 8000 && psEncC->prevSignalType == TYPE_NO_VOICE_ACTIVITY ) { /* Check if we should switch down */ - if( ( psEncC->fs_kHz == 12 && TargetRate_bps < MB2NB_BITRATE_BPS && psEncC->minInternal_fs_Hz <= 8000 ) || - ( psEncC->fs_kHz == 16 && TargetRate_bps < WB2MB_BITRATE_BPS && psEncC->minInternal_fs_Hz <= 12000 ) ) + if( SKP_SMULBB( psEncC->fs_kHz, 1000 ) > psEncC->desiredInternal_fs_Hz ) { /* Switch down */ if( psEncC->sLP.mode == 0 ) { @@ -91,8 +74,8 @@ SKP_int SKP_Silk_control_audio_bandwidth( } } else - if( ( psEncC->fs_kHz == 8 && TargetRate_bps > NB2MB_BITRATE_BPS && psEncC->maxInternal_fs_Hz >= 12000 && psEncC->API_fs_Hz >= 12000 ) || - ( psEncC->fs_kHz == 12 && TargetRate_bps > MB2WB_BITRATE_BPS && psEncC->maxInternal_fs_Hz >= 16000 && psEncC->API_fs_Hz >= 16000 ) ) + /* Check if we should switch up */ + if( SKP_SMULBB( psEncC->fs_kHz, 1000 ) < psEncC->desiredInternal_fs_Hz ) { /* Switch up */ if( psEncC->sLP.mode == 0 ) { diff --git a/src_common/SKP_Silk_control_codec.c b/src_common/SKP_Silk_control_codec.c index c497e19c5..00b4cc5ed 100644 --- a/src_common/SKP_Silk_control_codec.c +++ b/src_common/SKP_Silk_control_codec.c @@ -50,7 +50,7 @@ SKP_int SKP_Silk_setup_complexity( SKP_int Complexity /* I */ ); -static SKP_int SKP_Silk_setup_LBRR( +SKP_INLINE SKP_int SKP_Silk_setup_LBRR( SKP_Silk_encoder_state *psEncC, /* I/O */ const SKP_int32 TargetRate_bps /* I */ ); @@ -65,12 +65,13 @@ SKP_int SKP_Silk_control_encoder( { SKP_int fs_kHz, ret = 0; - psEnc->sCmn.useDTX = encControl->useDTX; - psEnc->sCmn.useCBR = encControl->useCBR; - psEnc->sCmn.API_fs_Hz = encControl->API_sampleRate; - psEnc->sCmn.maxInternal_fs_Hz = encControl->maxInternalSampleRate; - psEnc->sCmn.minInternal_fs_Hz = encControl->minInternalSampleRate; - psEnc->sCmn.useInBandFEC = encControl->useInBandFEC; + psEnc->sCmn.useDTX = encControl->useDTX; + psEnc->sCmn.useCBR = encControl->useCBR; + psEnc->sCmn.API_fs_Hz = encControl->API_sampleRate; + psEnc->sCmn.maxInternal_fs_Hz = encControl->maxInternalSampleRate; + psEnc->sCmn.minInternal_fs_Hz = encControl->minInternalSampleRate; + psEnc->sCmn.desiredInternal_fs_Hz = encControl->desiredInternalSampleRate; + psEnc->sCmn.useInBandFEC = encControl->useInBandFEC; if( psEnc->sCmn.controlled_since_last_payload != 0 && psEnc->sCmn.prefillFlag == 0 ) { if( psEnc->sCmn.API_fs_Hz != psEnc->sCmn.prev_API_fs_Hz && psEnc->sCmn.fs_kHz > 0 ) { @@ -85,7 +86,7 @@ SKP_int SKP_Silk_control_encoder( /********************************************/ /* Determine internal sampling rate */ /********************************************/ - fs_kHz = SKP_Silk_control_audio_bandwidth( &psEnc->sCmn, TargetRate_bps ); + fs_kHz = SKP_Silk_control_audio_bandwidth( &psEnc->sCmn ); /********************************************/ /* Prepare resampler and buffered data */ diff --git a/src_common/SKP_Silk_enc_API.c b/src_common/SKP_Silk_enc_API.c index 71dd5e916..b2619a82e 100644 --- a/src_common/SKP_Silk_enc_API.c +++ b/src_common/SKP_Silk_enc_API.c @@ -107,17 +107,18 @@ SKP_int SKP_Silk_SDK_QueryEncoder( state_Fxx = ((SKP_Silk_encoder *)encState)->state_Fxx; - encStatus->API_sampleRate = state_Fxx->sCmn.API_fs_Hz; - encStatus->maxInternalSampleRate = state_Fxx->sCmn.maxInternal_fs_Hz; - encStatus->minInternalSampleRate = state_Fxx->sCmn.minInternal_fs_Hz; - encStatus->payloadSize_ms = state_Fxx->sCmn.PacketSize_ms; - encStatus->bitRate = state_Fxx->sCmn.TargetRate_bps; - encStatus->packetLossPercentage = state_Fxx->sCmn.PacketLoss_perc; - encStatus->complexity = state_Fxx->sCmn.Complexity; - encStatus->useInBandFEC = state_Fxx->sCmn.useInBandFEC; - encStatus->useDTX = state_Fxx->sCmn.useDTX; - encStatus->useCBR = state_Fxx->sCmn.useCBR; - encStatus->internalSampleRate = SKP_SMULBB( state_Fxx->sCmn.fs_kHz, 1000 ); + encStatus->API_sampleRate = state_Fxx->sCmn.API_fs_Hz; + encStatus->maxInternalSampleRate = state_Fxx->sCmn.maxInternal_fs_Hz; + encStatus->minInternalSampleRate = state_Fxx->sCmn.minInternal_fs_Hz; + encStatus->desiredInternalSampleRate = state_Fxx->sCmn.desiredInternal_fs_Hz; + encStatus->payloadSize_ms = state_Fxx->sCmn.PacketSize_ms; + encStatus->bitRate = state_Fxx->sCmn.TargetRate_bps; + encStatus->packetLossPercentage = state_Fxx->sCmn.PacketLoss_perc; + encStatus->complexity = state_Fxx->sCmn.Complexity; + encStatus->useInBandFEC = state_Fxx->sCmn.useInBandFEC; + encStatus->useDTX = state_Fxx->sCmn.useDTX; + encStatus->useCBR = state_Fxx->sCmn.useCBR; + encStatus->internalSampleRate = SKP_SMULBB( state_Fxx->sCmn.fs_kHz, 1000 ); return ret; } diff --git a/src_common/SKP_Silk_main.h b/src_common/SKP_Silk_main.h index f8de3ea21..3aff2dfea 100644 --- a/src_common/SKP_Silk_main.h +++ b/src_common/SKP_Silk_main.h @@ -97,8 +97,7 @@ SKP_int check_control_input( /* Control internal sampling rate */ SKP_int SKP_Silk_control_audio_bandwidth( - SKP_Silk_encoder_state *psEncC, /* I/O Pointer to Silk encoder state */ - SKP_int32 TargetRate_bps /* I Target max bitrate (bps) */ + SKP_Silk_encoder_state *psEncC /* I/O Pointer to Silk encoder state */ ); /* Control SNR of redidual quantizer */ diff --git a/src_common/SKP_Silk_structs.h b/src_common/SKP_Silk_structs.h index cbceaee4a..a3b151946 100644 --- a/src_common/SKP_Silk_structs.h +++ b/src_common/SKP_Silk_structs.h @@ -28,9 +28,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef SKP_SILK_STRUCTS_H #define SKP_SILK_STRUCTS_H -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "SKP_Silk_typedef.h" #include "SKP_Silk_SigProc_FIX.h" @@ -137,6 +137,7 @@ typedef struct { SKP_int32 prev_API_fs_Hz; /* Previous API sampling frequency (Hz) */ SKP_int maxInternal_fs_Hz; /* Maximum internal sampling frequency (Hz) */ SKP_int minInternal_fs_Hz; /* Minimum internal sampling frequency (Hz) */ + SKP_int desiredInternal_fs_Hz; /* Soft request for internal sampling frequency (Hz) */ SKP_int fs_kHz; /* Internal sampling frequency (kHz) */ SKP_int nb_subfr; /* Number of 5 ms subframes in a frame */ SKP_int frame_length; /* Frame length (samples) */ diff --git a/src_common/SKP_Silk_tuning_parameters.h b/src_common/SKP_Silk_tuning_parameters.h index a26fd7f77..c5d8d418d 100644 --- a/src_common/SKP_Silk_tuning_parameters.h +++ b/src_common/SKP_Silk_tuning_parameters.h @@ -159,12 +159,6 @@ extern "C" /* Compensation in bitrate calculations for 10 ms modes */ #define REDUCE_BITRATE_10_MS_BPS 2200 -/* Transition bitrates between modes */ -#define WB2MB_BITRATE_BPS 12600 -#define MB2WB_BITRATE_BPS 15600 -#define MB2NB_BITRATE_BPS 9600 -#define NB2MB_BITRATE_BPS 12600 - #ifdef __cplusplus } #endif -- GitLab