diff options
-rw-r--r-- | silk/dec_API.c | 28 | ||||
-rw-r--r-- | silk/decode_frame.c | 7 | ||||
-rw-r--r-- | silk/decode_indices.c | 18 | ||||
-rw-r--r-- | silk/decode_parameters.c | 5 | ||||
-rw-r--r-- | silk/define.h | 5 | ||||
-rw-r--r-- | silk/enc_API.c | 26 | ||||
-rw-r--r-- | silk/encode_indices.c | 18 | ||||
-rw-r--r-- | silk/fixed/LTP_scale_ctrl_FIX.c | 6 | ||||
-rw-r--r-- | silk/fixed/encode_frame_FIX.c | 14 | ||||
-rw-r--r-- | silk/fixed/find_pred_coefs_FIX.c | 5 | ||||
-rw-r--r-- | silk/fixed/main_FIX.h | 12 | ||||
-rw-r--r-- | silk/fixed/process_gains_FIX.c | 3 | ||||
-rw-r--r-- | silk/float/LTP_scale_ctrl_FLP.c | 5 | ||||
-rw-r--r-- | silk/float/encode_frame_FLP.c | 19 | ||||
-rw-r--r-- | silk/float/find_pred_coefs_FLP.c | 5 | ||||
-rw-r--r-- | silk/float/main_FLP.h | 12 | ||||
-rw-r--r-- | silk/float/process_gains_FLP.c | 5 | ||||
-rw-r--r-- | silk/main.h | 12 |
18 files changed, 134 insertions, 71 deletions
diff --git a/silk/dec_API.c b/silk/dec_API.c index ade060f9..018173ef 100644 --- a/silk/dec_API.c +++ b/silk/dec_API.c @@ -182,13 +182,21 @@ opus_int silk_Decode( for( n = 0; n < decControl->nChannelsInternal; n++ ) { if( channel_state[ n ].LBRR_flags[ i ] ) { opus_int pulses[ MAX_FRAME_LENGTH ]; + opus_int condCoding; + if( decControl->nChannelsInternal == 2 && n == 0 ) { silk_stereo_decode_pred( psRangeDec, MS_pred_Q13 ); if( channel_state[ 1 ].LBRR_flags[ i ] == 0 ) { silk_stereo_decode_mid_only( psRangeDec, &decode_only_middle ); } } - silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1 ); + /* Use conditional coding if previous frame available */ + if( i > 0 && channel_state[ n ].LBRR_flags[ i - 1 ] ) { + condCoding = CODE_CONDITIONALLY; + } else { + condCoding = CODE_INDEPENDENTLY; + } + silk_decode_indices( &channel_state[ n ], psRangeDec, i, 1, condCoding ); silk_decode_pulses( psRangeDec, pulses, channel_state[ n ].indices.signalType, channel_state[ n ].indices.quantOffsetType, channel_state[ n ].frame_length ); } @@ -230,7 +238,23 @@ opus_int silk_Decode( /* Call decoder for one frame */ for( n = 0; n < decControl->nChannelsInternal; n++ ) { if( n == 0 || ( ( lostFlag != FLAG_PACKET_LOST ? decode_only_middle : psDec->prev_decode_only_middle ) == 0 ) ) { - ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 + delay ], &nSamplesOutDec, lostFlag ); + opus_int FrameIndex; + opus_int condCoding; + + FrameIndex = channel_state[ 0 ].nFramesDecoded - n; + /* Use independent coding if no previous frame available */ + if( FrameIndex <= 0 ) { + condCoding = CODE_INDEPENDENTLY; + } else if( lostFlag == FLAG_DECODE_LBRR ) { + condCoding = channel_state[ n ].LBRR_flags[ FrameIndex - 1 ] ? CODE_CONDITIONALLY : CODE_INDEPENDENTLY; + } else if( n > 0 && psDec->prev_decode_only_middle ) { + /* If we skipped a side frame in this packet, we don't + need LTP scaling; the LTP state is well-defined. */ + condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING; + } else { + condCoding = CODE_CONDITIONALLY; + } + ret += silk_decode_frame( &channel_state[ n ], psRangeDec, &samplesOut1_tmp[ n ][ 2 + delay ], &nSamplesOutDec, lostFlag, condCoding); } else { silk_memset( &samplesOut1_tmp[ n ][ 2 + delay ], 0, nSamplesOutDec * sizeof( opus_int16 ) ); } diff --git a/silk/decode_frame.c b/silk/decode_frame.c index 24786174..54bb920b 100644 --- a/silk/decode_frame.c +++ b/silk/decode_frame.c @@ -40,7 +40,8 @@ opus_int silk_decode_frame( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 pOut[], /* O Pointer to output speech frame */ opus_int32 *pN, /* O Pointer to size of output frame */ - opus_int lostFlag /* I 0: no loss, 1 loss, 2 decode fec */ + opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ + opus_int condCoding /* I The type of conditional coding to use */ ) { silk_decoder_control sDecCtrl; @@ -62,7 +63,7 @@ TIC(DECODE_FRAME) /* Decode quantization indices of side info */ /*********************************************/ TIC(decode_indices) - silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag ); + silk_decode_indices( psDec, psRangeDec, psDec->nFramesDecoded, lostFlag, condCoding ); TOC(decode_indices) /*********************************************/ @@ -77,7 +78,7 @@ TOC(decode_pulses) /* Decode parameters and pulse signal */ /********************************************/ TIC(decode_params) - silk_decode_parameters( psDec, &sDecCtrl ); + silk_decode_parameters( psDec, &sDecCtrl, condCoding ); TOC(decode_params) /* Update length. Sampling frequency may have changed */ diff --git a/silk/decode_indices.c b/silk/decode_indices.c index 9ea0a80e..8ac53f4b 100644 --- a/silk/decode_indices.c +++ b/silk/decode_indices.c @@ -36,21 +36,15 @@ void silk_decode_indices( silk_decoder_state *psDec, /* I/O State */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int FrameIndex, /* I Frame number */ - opus_int decode_LBRR /* I Flag indicating LBRR data is being decoded */ + opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ + opus_int condCoding /* I The type of conditional coding to use */ ) { - opus_int i, k, Ix, condCoding; + opus_int i, k, Ix; opus_int decode_absolute_lagIndex, delta_lagIndex; opus_int16 ec_ix[ MAX_LPC_ORDER ]; opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; - /* Use conditional coding if previous frame available */ - if( FrameIndex > 0 && ( decode_LBRR == 0 || psDec->LBRR_flags[ FrameIndex - 1 ] == 1 ) ) { - condCoding = 1; - } else { - condCoding = 0; - } - /*******************************************/ /* Decode signal type and quantizer offset */ /*******************************************/ @@ -66,7 +60,7 @@ void silk_decode_indices( /* Decode gains */ /****************/ /* First subframe */ - if( condCoding ) { + if( condCoding == CODE_CONDITIONALLY ) { /* Conditional coding */ psDec->indices.GainsIndices[ 0 ] = (opus_int8)ec_dec_icdf( psRangeDec, silk_delta_gain_iCDF, 8 ); } else { @@ -110,7 +104,7 @@ void silk_decode_indices( /*********************/ /* Get lag index */ decode_absolute_lagIndex = 1; - if( condCoding && psDec->ec_prevSignalType == TYPE_VOICED ) { + if( condCoding == CODE_CONDITIONALLY && psDec->ec_prevSignalType == TYPE_VOICED ) { /* Decode Delta index */ delta_lagIndex = (opus_int16)ec_dec_icdf( psRangeDec, silk_pitch_delta_iCDF, 8 ); if( delta_lagIndex > 0 ) { @@ -142,7 +136,7 @@ void silk_decode_indices( /**********************/ /* Decode LTP scaling */ /**********************/ - if( !condCoding ) { + if( condCoding == CODE_INDEPENDENTLY ) { psDec->indices.LTP_scaleIndex = (opus_int8)ec_dec_icdf( psRangeDec, silk_LTPscale_iCDF, 8 ); } else { psDec->indices.LTP_scaleIndex = 0; diff --git a/silk/decode_parameters.c b/silk/decode_parameters.c index ad4788f9..1ab8ed74 100644 --- a/silk/decode_parameters.c +++ b/silk/decode_parameters.c @@ -34,7 +34,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Decode parameters from payload */ void silk_decode_parameters( silk_decoder_state *psDec, /* I/O State */ - silk_decoder_control *psDecCtrl /* I/O Decoder control */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int i, k, Ix; @@ -43,7 +44,7 @@ void silk_decode_parameters( /* Dequant Gains */ silk_gains_dequant( psDecCtrl->Gains_Q16, psDec->indices.GainsIndices, - &psDec->LastGainIndex, psDec->nFramesDecoded, psDec->nb_subfr ); + &psDec->LastGainIndex, condCoding == CODE_CONDITIONALLY, psDec->nb_subfr ); /****************/ /* Decode NLSFs */ diff --git a/silk/define.h b/silk/define.h index f56ca2d7..8f9935fc 100644 --- a/silk/define.h +++ b/silk/define.h @@ -66,6 +66,11 @@ extern "C" #define TYPE_UNVOICED 1 #define TYPE_VOICED 2 +/* Conditional coding types */ +#define CODE_INDEPENDENTLY 0 +#define CODE_INDEPENDENTLY_NO_LTP_SCALING 1 +#define CODE_CONDITIONALLY 2 + /* Settings for stereo processing */ #define STEREO_QUANT_TAB_SIZE 16 #define STEREO_QUANT_SUB_STEPS 5 diff --git a/silk/enc_API.c b/silk/enc_API.c index 339dafc4..7177d4d5 100644 --- a/silk/enc_API.c +++ b/silk/enc_API.c @@ -330,6 +330,8 @@ opus_int silk_Encode( for( i = 0; i < psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket; i++ ) { for( n = 0; n < encControl->nChannelsInternal; n++ ) { if( psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i ] ) { + opus_int condCoding; + if( encControl->nChannelsInternal == 2 && n == 0 ) { silk_stereo_encode_pred( psRangeEnc, psEnc->sStereo.predIx[ i ] ); /* For LBRR data there's no need to code the mid-only flag if the side-channel LBRR flag is set */ @@ -337,7 +339,13 @@ opus_int silk_Encode( silk_stereo_encode_mid_only( psRangeEnc, psEnc->sStereo.mid_only_flags[ i ] ); } } - silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1 ); + /* Use conditional coding if previous frame available */ + if( i > 0 && psEnc->state_Fxx[ n ].sCmn.LBRR_flags[ i - 1 ] ) { + condCoding = CODE_CONDITIONALLY; + } else { + condCoding = CODE_INDEPENDENTLY; + } + silk_encode_indices( &psEnc->state_Fxx[ n ].sCmn, psRangeEnc, i, 1, condCoding ); silk_encode_pulses( psRangeEnc, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].signalType, psEnc->state_Fxx[ n ].sCmn.indices_LBRR[i].quantOffsetType, psEnc->state_Fxx[ n ].sCmn.pulses_LBRR[ i ], psEnc->state_Fxx[ n ].sCmn.frame_length ); } @@ -400,7 +408,6 @@ opus_int silk_Encode( psEnc->state_Fxx[ 1 ].sCmn.prevSignalType = TYPE_NO_VOICE_ACTIVITY; psEnc->state_Fxx[ 1 ].sCmn.sNSQ.prev_inv_gain_Q16 = 65536; } - psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded ]; /* Encode */ for( n = 0; n < encControl->nChannelsInternal; n++ ) { @@ -411,9 +418,21 @@ opus_int silk_Encode( } if( channelRate_bps > 0 ) { + opus_int condCoding; + silk_control_SNR( &psEnc->state_Fxx[ n ].sCmn, channelRate_bps ); - if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc ) ) != 0 ) { + /* Use independent coding if no previous frame available */ + if( psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - n <= 0 ) { + condCoding = CODE_INDEPENDENTLY; + } else if( n > 0 && psEnc->prev_decode_only_middle ) { + /* If we skipped a side frame in this packet, we don't + need LTP scaling; the LTP state is well-defined. */ + condCoding = CODE_INDEPENDENTLY_NO_LTP_SCALING; + } else { + condCoding = CODE_CONDITIONALLY; + } + if( ( ret = silk_encode_frame_Fxx( &psEnc->state_Fxx[ n ], nBytesOut, psRangeEnc, condCoding ) ) != 0 ) { silk_assert( 0 ); } psEnc->state_Fxx[ n ].sCmn.nFramesEncoded++; @@ -421,6 +440,7 @@ opus_int silk_Encode( psEnc->state_Fxx[ n ].sCmn.controlled_since_last_payload = 0; psEnc->state_Fxx[ n ].sCmn.inputBufIx = 0; } + psEnc->prev_decode_only_middle = psEnc->sStereo.mid_only_flags[ psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded - 1 ]; /* Insert VAD and FEC flags at beginning of bitstream */ if( *nBytesOut > 0 && psEnc->state_Fxx[ 0 ].sCmn.nFramesEncoded == psEnc->state_Fxx[ 0 ].sCmn.nFramesPerPacket) { diff --git a/silk/encode_indices.c b/silk/encode_indices.c index 6d8e82a1..f87de036 100644 --- a/silk/encode_indices.c +++ b/silk/encode_indices.c @@ -36,10 +36,11 @@ void silk_encode_indices( silk_encoder_state *psEncC, /* I/O Encoder state */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int FrameIndex, /* I Frame number */ - opus_int encode_LBRR /* I Flag indicating LBRR data is being encoded */ + opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ + opus_int condCoding /* I The type of conditional coding to use */ ) { - opus_int i, k, condCoding, typeOffset; + opus_int i, k, typeOffset; opus_int encode_absolute_lagIndex, delta_lagIndex; opus_int16 ec_ix[ MAX_LPC_ORDER ]; opus_uint8 pred_Q8[ MAX_LPC_ORDER ]; @@ -49,13 +50,6 @@ void silk_encode_indices( opus_int nBytes_after, nBytes_before; #endif - /* Use conditional coding if previous frame available */ - if( FrameIndex > 0 && ( encode_LBRR == 0 || psEncC->LBRR_flags[ FrameIndex - 1 ] == 1 ) ) { - condCoding = 1; - } else { - condCoding = 0; - } - if( encode_LBRR ) { psIndices = &psEncC->indices_LBRR[ FrameIndex ]; } else { @@ -81,7 +75,7 @@ void silk_encode_indices( nBytes_before = silk_RSHIFT( ec_tell( psRangeEnc ) + 7, 3 ); #endif /* first subframe */ - if( condCoding ) { + if( condCoding == CODE_CONDITIONALLY ) { /* conditional coding */ silk_assert( psIndices->GainsIndices[ 0 ] >= 0 && psIndices->GainsIndices[ 0 ] < MAX_DELTA_GAIN_QUANT - MIN_DELTA_GAIN_QUANT + 1 ); ec_enc_icdf( psRangeEnc, psIndices->GainsIndices[ 0 ], silk_delta_gain_iCDF, 8 ); @@ -148,7 +142,7 @@ void silk_encode_indices( #endif /* lag index */ encode_absolute_lagIndex = 1; - if( condCoding && psEncC->ec_prevSignalType == TYPE_VOICED ) { + if( condCoding == CODE_CONDITIONALLY && psEncC->ec_prevSignalType == TYPE_VOICED ) { /* Delta Encoding */ delta_lagIndex = psIndices->lagIndex - psEncC->ec_prevLagIndex; if( delta_lagIndex < -8 || delta_lagIndex > 11 ) { @@ -212,7 +206,7 @@ void silk_encode_indices( /**********************/ /* Encode LTP scaling */ /**********************/ - if( !condCoding ) { + if( condCoding == CODE_INDEPENDENTLY ) { silk_assert( psIndices->LTP_scaleIndex >= 0 && psIndices->LTP_scaleIndex < 3 ); ec_enc_icdf( psRangeEnc, psIndices->LTP_scaleIndex, silk_LTPscale_iCDF, 8 ); } diff --git a/silk/fixed/LTP_scale_ctrl_FIX.c b/silk/fixed/LTP_scale_ctrl_FIX.c index 463cf735..5e85cc74 100644 --- a/silk/fixed/LTP_scale_ctrl_FIX.c +++ b/silk/fixed/LTP_scale_ctrl_FIX.c @@ -33,7 +33,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. void silk_LTP_scale_ctrl_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state FIX */ - silk_encoder_control_FIX *psEncCtrl /* I/O encoder control FIX */ + silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control FIX */ + opus_int condCoding /* I The type of conditional coding to use */ + ) { opus_int round_loss; @@ -44,7 +46,7 @@ void silk_LTP_scale_ctrl_FIX( psEnc->prevLTPredCodGain_Q7 = psEncCtrl->LTPredCodGain_Q7; /* Only scale if first frame in packet */ - if( psEnc->sCmn.nFramesEncoded == 0 ) { + if( condCoding == CODE_INDEPENDENTLY ) { round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket - 1; psEnc->sCmn.indices.LTP_scaleIndex = (opus_int8)silk_LIMIT( silk_SMULWB( silk_SMULBB( round_loss, psEnc->HPLTPredCodGain_Q7 ), SILK_FIX_CONST( 0.1, 9 ) ), 0, 2 ); diff --git a/silk/fixed/encode_frame_FIX.c b/silk/fixed/encode_frame_FIX.c index 6f4367f7..c3da9bcf 100644 --- a/silk/fixed/encode_frame_FIX.c +++ b/silk/fixed/encode_frame_FIX.c @@ -38,7 +38,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. opus_int silk_encode_frame_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state FIX */ opus_int32 *pnBytesOut, /* O Number of payload bytes */ - ec_enc *psRangeEnc /* I/O compressor data structure */ + ec_enc *psRangeEnc, /* I/O compressor data structure */ + opus_int condCoding /* I The type of conditional coding to use */ ) { silk_encoder_control_FIX sEncCtrl; @@ -116,7 +117,7 @@ TOC(NOISE_SHAPE_ANALYSIS) /* Find linear prediction coefficients (LPC + LTP) */ /***************************************************/ TIC(FIND_PRED_COEF) - silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch, x_frame ); + silk_find_pred_coefs_FIX( psEnc, &sEncCtrl, res_pitch, x_frame, condCoding ); TOC(FIND_PRED_COEF) /****************************************/ @@ -137,7 +138,7 @@ TOC(PREFILTER) /* Low Bitrate Redundant Encoding */ /****************************************/ TIC(LBRR) - silk_LBRR_encode_FIX( psEnc, &sEncCtrl, xfw ); + silk_LBRR_encode_FIX( psEnc, &sEncCtrl, xfw, condCoding ); TOC(LBRR) /*****************************************/ @@ -174,7 +175,7 @@ TOC(NSQ) /* Encode Parameters */ /****************************************/ TIC(ENCODE_PARAMS) - silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0 ); + silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); TOC(ENCODE_PARAMS) /****************************************/ @@ -242,7 +243,8 @@ TOC(ENCODE_FRAME) void silk_LBRR_encode_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O Pointer to Silk FIX encoder control struct */ - const opus_int16 xfw[] /* I Input signal */ + const opus_int16 xfw[], /* I Input signal */ + opus_int condCoding /* I The type of conditional coding used so far for this frame */ ) { opus_int32 TempGains_Q16[ MAX_NB_SUBFR ]; @@ -274,7 +276,7 @@ void silk_LBRR_encode_FIX( /* Decode to get gains in sync with decoder */ /* Overwrite unquantized gains with quantized gains */ silk_gains_dequant( psEncCtrl->Gains_Q16, psIndices_LBRR->GainsIndices, - &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesEncoded, psEnc->sCmn.nb_subfr ); + &psEnc->sCmn.LBRRprevLastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /*****************************************/ /* Noise shaping quantization */ diff --git a/silk/fixed/find_pred_coefs_FIX.c b/silk/fixed/find_pred_coefs_FIX.c index 980e321d..e9891cd4 100644 --- a/silk/fixed/find_pred_coefs_FIX.c +++ b/silk/fixed/find_pred_coefs_FIX.c @@ -35,7 +35,8 @@ void silk_find_pred_coefs_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ const opus_int16 res_pitch[], /* I Residual from pitch analysis */ - const opus_int16 x[] /* I Speech signal */ + const opus_int16 x[], /* I Speech signal */ + opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int i; @@ -86,7 +87,7 @@ void silk_find_pred_coefs_FIX( WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr); /* Control LTP scaling */ - silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl ); + silk_LTP_scale_ctrl_FIX( psEnc, psEncCtrl, condCoding ); /* Create LTP residual */ silk_LTP_analysis_filter_FIX( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef_Q14, diff --git a/silk/fixed/main_FIX.h b/silk/fixed/main_FIX.h index e0b1e054..56ba1ef0 100644 --- a/silk/fixed/main_FIX.h +++ b/silk/fixed/main_FIX.h @@ -59,7 +59,8 @@ void silk_HP_variable_cutoff( opus_int silk_encode_frame_FIX( silk_encoder_state_FIX *psEnc, /* I/O Pointer to Silk FIX encoder state */ opus_int32 *pnBytesOut, /* O Pointer to number of payload bytes; */ - ec_enc *psRangeEnc /* I/O compressor data structure */ + ec_enc *psRangeEnc, /* I/O compressor data structure */ + opus_int condCoding /* I The type of conditional coding to use */ ); /* Low Bitrate Redundancy (LBRR) encoding. Reuse all parameters but encode with lower bitrate */ @@ -118,7 +119,8 @@ void silk_warped_autocorrelation_FIX( /* Calculation of LTP state scaling */ void silk_LTP_scale_ctrl_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ - silk_encoder_control_FIX *psEncCtrl /* I/O encoder control */ + silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ + opus_int condCoding /* I The type of conditional coding to use */ ); /**********************************************/ @@ -137,7 +139,8 @@ void silk_find_pred_coefs_FIX( silk_encoder_state_FIX *psEnc, /* I/O encoder state */ silk_encoder_control_FIX *psEncCtrl, /* I/O encoder control */ const opus_int16 res_pitch[], /* I Residual from pitch analysis */ - const opus_int16 x[] /* I Speech signal */ + const opus_int16 x[], /* I Speech signal */ + opus_int condCoding /* I The type of conditional coding to use */ ); /* LPC analysis */ @@ -204,7 +207,8 @@ opus_int32 silk_residual_energy16_covar_FIX( /* Processing of gains */ void silk_process_gains_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state */ - silk_encoder_control_FIX *psEncCtrl /* I/O Encoder control */ + silk_encoder_control_FIX *psEncCtrl, /* I/O Encoder control */ + opus_int condCoding /* I The type of conditional coding to use */ ); /******************/ diff --git a/silk/fixed/process_gains_FIX.c b/silk/fixed/process_gains_FIX.c index 0dea69b6..4fe55bb0 100644 --- a/silk/fixed/process_gains_FIX.c +++ b/silk/fixed/process_gains_FIX.c @@ -36,6 +36,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. void silk_process_gains_FIX( silk_encoder_state_FIX *psEnc, /* I/O Encoder state_FIX */ silk_encoder_control_FIX *psEncCtrl /* I/O Encoder control_FIX */ + opus_int condCoding /* The type of conditional coding to use */ ) { silk_shape_state_FIX *psShapeSt = &psEnc->sShape; @@ -87,7 +88,7 @@ void silk_process_gains_FIX( /* Noise shaping quantization */ silk_gains_quant( psEnc->sCmn.indices.GainsIndices, psEncCtrl->Gains_Q16, - &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesEncoded, psEnc->sCmn.nb_subfr ); + &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /* Set quantizer offset for voiced signals. Larger offset when LTP coding gain is low or tilt is high (ie low-pass) */ if( psEnc->sCmn.indices.signalType == TYPE_VOICED ) { diff --git a/silk/float/LTP_scale_ctrl_FLP.c b/silk/float/LTP_scale_ctrl_FLP.c index 76290b14..cbac1005 100644 --- a/silk/float/LTP_scale_ctrl_FLP.c +++ b/silk/float/LTP_scale_ctrl_FLP.c @@ -33,7 +33,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. void silk_LTP_scale_ctrl_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */ + silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ + opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int round_loss; @@ -45,7 +46,7 @@ void silk_LTP_scale_ctrl_FLP( psEnc->prevLTPredCodGain = psEncCtrl->LTPredCodGain; /* Only scale if first frame in packet */ - if( psEnc->sCmn.nFramesEncoded == 0 ) { + if( condCoding == CODE_INDEPENDENTLY ) { round_loss = psEnc->sCmn.PacketLoss_perc + psEnc->sCmn.nFramesPerPacket; psEnc->sCmn.indices.LTP_scaleIndex = (opus_int8)silk_LIMIT( round_loss * psEnc->HPLTPredCodGain * 0.1f, 0.0f, 2.0f ); } else { diff --git a/silk/float/encode_frame_FLP.c b/silk/float/encode_frame_FLP.c index 4d156a03..d1056428 100644 --- a/silk/float/encode_frame_FLP.c +++ b/silk/float/encode_frame_FLP.c @@ -36,7 +36,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. static inline void silk_LBRR_encode_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - const silk_float xfw[] /* I Input signal */ + const silk_float xfw[], /* I Input signal */ + opus_int condCoding /* I The type of conditional coding used so far for this frame */ ); /****************/ @@ -45,7 +46,8 @@ static inline void silk_LBRR_encode_FLP( opus_int silk_encode_frame_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ opus_int32 *pnBytesOut, /* O Number of payload bytes */ - ec_enc *psRangeEnc /* I/O compressor data structure */ + ec_enc *psRangeEnc, /* I/O compressor data structure */ + opus_int condCoding /* I The type of conditional coding to use */ ) { silk_encoder_control_FLP sEncCtrl; @@ -128,14 +130,14 @@ TOC(NOISE_SHAPE_ANALYSIS) /* Find linear prediction coefficients (LPC + LTP) */ /***************************************************/ TIC(FIND_PRED_COEF) - silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch, x_frame ); + silk_find_pred_coefs_FLP( psEnc, &sEncCtrl, res_pitch, x_frame, condCoding ); TOC(FIND_PRED_COEF) /****************************************/ /* Process gains */ /****************************************/ TIC(PROCESS_GAINS) - silk_process_gains_FLP( psEnc, &sEncCtrl ); + silk_process_gains_FLP( psEnc, &sEncCtrl, condCoding ); TOC(PROCESS_GAINS) /*****************************************/ @@ -149,7 +151,7 @@ TOC(PREFILTER) /* Low Bitrate Redundant Encoding */ /****************************************/ TIC(LBRR) - silk_LBRR_encode_FLP( psEnc, &sEncCtrl, xfw ); + silk_LBRR_encode_FLP( psEnc, &sEncCtrl, xfw, condCoding ); TOC(LBRR) /*****************************************/ @@ -178,7 +180,7 @@ TOC(NSQ) /* Encode Parameters */ /****************************************/ TIC(ENCODE_PARAMS) - silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0 ); + silk_encode_indices( &psEnc->sCmn, psRangeEnc, psEnc->sCmn.nFramesEncoded, 0, condCoding ); TOC(ENCODE_PARAMS) /****************************************/ @@ -222,7 +224,8 @@ TOC(ENCODE_FRAME) static inline void silk_LBRR_encode_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ - const silk_float xfw[] /* I Input signal */ + const silk_float xfw[], /* I Input signal */ + opus_int condCoding /* I The type of conditional coding used so far for this frame */ ) { opus_int k; @@ -255,7 +258,7 @@ static inline void silk_LBRR_encode_FLP( /* Decode to get gains in sync with decoder */ silk_gains_dequant( Gains_Q16, psIndices_LBRR->GainsIndices, - &psEnc->sCmn.LBRRprevLastGainIndex, psEnc->sCmn.nFramesEncoded, psEnc->sCmn.nb_subfr ); + &psEnc->sCmn.LBRRprevLastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { diff --git a/silk/float/find_pred_coefs_FLP.c b/silk/float/find_pred_coefs_FLP.c index 49c29d36..04881855 100644 --- a/silk/float/find_pred_coefs_FLP.c +++ b/silk/float/find_pred_coefs_FLP.c @@ -36,7 +36,8 @@ void silk_find_pred_coefs_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float res_pitch[], /* I Residual from pitch analysis */ - const silk_float x[] /* I Speech signal */ + const silk_float x[], /* I Speech signal */ + opus_int condCoding /* I The type of conditional coding to use */ ) { opus_int i; @@ -73,7 +74,7 @@ void silk_find_pred_coefs_FLP( WLTP, psEnc->sCmn.mu_LTP_Q9, psEnc->sCmn.LTPQuantLowComplexity, psEnc->sCmn.nb_subfr ); /* Control LTP scaling */ - silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl ); + silk_LTP_scale_ctrl_FLP( psEnc, psEncCtrl, condCoding ); /* Create LTP residual */ silk_LTP_analysis_filter_FLP( LPC_in_pre, x - psEnc->sCmn.predictLPCOrder, psEncCtrl->LTPCoef, diff --git a/silk/float/main_FLP.h b/silk/float/main_FLP.h index 605fd384..d0c2de7c 100644 --- a/silk/float/main_FLP.h +++ b/silk/float/main_FLP.h @@ -57,7 +57,8 @@ void silk_HP_variable_cutoff( opus_int silk_encode_frame_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ opus_int32 *pnBytesOut, /* O Number of payload bytes; */ - ec_enc *psRangeEnc /* I/O compressor data structure */ + ec_enc *psRangeEnc, /* I/O compressor data structure */ + opus_int condCoding /* I The type of conditional coding to use */ ); /* Initializes the Silk encoder state */ @@ -108,7 +109,8 @@ void silk_warped_autocorrelation_FLP( /* Calculation of LTP state scaling */ void silk_LTP_scale_ctrl_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */ + silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ + opus_int condCoding /* I The type of conditional coding to use */ ); /**********************************************/ @@ -127,7 +129,8 @@ void silk_find_pred_coefs_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ const silk_float res_pitch[], /* I Residual from pitch analysis */ - const silk_float x[] /* I Speech signal */ + const silk_float x[], /* I Speech signal */ + opus_int condCoding /* I The type of conditional coding to use */ ); /* LPC analysis */ @@ -234,7 +237,8 @@ void silk_VQ_WMat_EC_FLP( /* Processing of gains */ void silk_process_gains_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */ + silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ + opus_int condCoding /* I The type of conditional coding to use */ ); /******************/ diff --git a/silk/float/process_gains_FLP.c b/silk/float/process_gains_FLP.c index e0c18a97..2c7dfdd0 100644 --- a/silk/float/process_gains_FLP.c +++ b/silk/float/process_gains_FLP.c @@ -35,7 +35,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* Processing of gains */ void silk_process_gains_FLP( silk_encoder_state_FLP *psEnc, /* I/O Encoder state FLP */ - silk_encoder_control_FLP *psEncCtrl /* I/O Encoder control FLP */ + silk_encoder_control_FLP *psEncCtrl, /* I/O Encoder control FLP */ + opus_int condCoding /* I The type of conditional coding to use */ ) { silk_shape_state_FLP *psShapeSt = &psEnc->sShape; @@ -68,7 +69,7 @@ void silk_process_gains_FLP( /* Noise shaping quantization */ silk_gains_quant( psEnc->sCmn.indices.GainsIndices, pGains_Q16, - &psShapeSt->LastGainIndex, psEnc->sCmn.nFramesEncoded, psEnc->sCmn.nb_subfr ); + &psShapeSt->LastGainIndex, condCoding == CODE_CONDITIONALLY, psEnc->sCmn.nb_subfr ); /* Overwrite unquantized gains with quantized gains and convert back to Q0 from Q16 */ for( k = 0; k < psEnc->sCmn.nb_subfr; k++ ) { diff --git a/silk/main.h b/silk/main.h index 85423ab6..1f2f01a7 100644 --- a/silk/main.h +++ b/silk/main.h @@ -377,7 +377,8 @@ opus_int silk_decode_frame( ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int16 pOut[], /* O Pointer to output speech frame */ opus_int32 *pN, /* O Pointer to size of output frame */ - opus_int lostFlag /* I 0: no loss, 1 loss, 2 decode fec */ + opus_int lostFlag, /* I 0: no loss, 1 loss, 2 decode fec */ + opus_int condCoding /* I The type of conditional coding to use */ ); /* Decode LBRR side info and excitation */ @@ -391,13 +392,15 @@ void silk_decode_indices( silk_decoder_state *psDec, /* I/O State */ ec_dec *psRangeDec, /* I/O Compressor data structure */ opus_int FrameIndex, /* I Frame number */ - opus_int decode_LBRR /* I Flag indicating LBRR data is being decoded */ + opus_int decode_LBRR, /* I Flag indicating LBRR data is being decoded */ + opus_int condCoding /* I The type of conditional coding to use */ ); /* Decode parameters from payload */ void silk_decode_parameters( silk_decoder_state *psDec, /* I/O State */ - silk_decoder_control *psDecCtrl /* I/O Decoder control */ + silk_decoder_control *psDecCtrl, /* I/O Decoder control */ + opus_int condCoding /* I The type of conditional coding to use */ ); /* Core decoder. Performs inverse NSQ operation LTP + LPC */ @@ -439,7 +442,8 @@ void silk_encode_indices( silk_encoder_state *psEncC, /* I/O Encoder state */ ec_enc *psRangeEnc, /* I/O Compressor data structure */ opus_int FrameIndex, /* I Frame number */ - opus_int encode_LBRR /* I Flag indicating LBRR data is being encoded */ + opus_int encode_LBRR, /* I Flag indicating LBRR data is being encoded */ + opus_int condCoding /* I The type of conditional coding to use */ ); #endif |