diff --git a/lib_com/options.h b/lib_com/options.h index baecc29e39933e9469a07debae5921250d1387f8..1b0440bbcd5345160910afad7356f0b173e107cb 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -102,6 +102,7 @@ #define HARMONIZE_TBE2 /* VA: basop issue 2399: Remove duplicated code: TBE, step 2 */ #define HARM_FD_BWE /* VA: harmonize core-coder FD BWE function duplications */ #define FIX_2411_Harmonize_TNSANALYSIS_DETECTTNSFILT /* FhG: basop issue 2411: harmonize TNSAnalysis*_fx(), DetectTnsFilt*_fx()*/ +#define HARMONIZE_READ_DECODE_TNS /* FhG basop 2389: Harm between two pairs of functions. */ /* #################### End BE switches ################################## */ diff --git a/lib_com/parameter_bitmaping_fx.c b/lib_com/parameter_bitmaping_fx.c index 4225879e6b20e56584e35c4bc40240cfc0112337..5a2f8ccfe640147dd4798ff6246940ac0a119ee9 100644 --- a/lib_com/parameter_bitmaping_fx.c +++ b/lib_com/parameter_bitmaping_fx.c @@ -228,8 +228,15 @@ void SetParameters_fx( IF( s_and( param->pSubParamBitMap != NULL, value > 0 ) ) { pTmp = pParameter; +#ifdef HARMONIZE_READ_DECODE_TNS if ( pSubStruct != NULL ) + { pTmp = pSubStruct; + } +#else + if ( pSubStruct != NULL ) + pTmp = pSubStruct; +#endif SetParameters( param->pSubParamBitMap, value, pTmp, pStream, pnSize ); } } diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index c9ad7fcff8339eec8ea1d878a3770ed519a1784b..d3d45ab1d6ba2d9fccb8187c0f4b35566df10fae 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -7489,8 +7489,8 @@ ivas_error core_switching_post_dec_fx( Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q11*/ Word32 output_mem_fx32[], /* i : OLA memory from last TCX/HQ frame Qx*/ #else - Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q4*/ - Word16 output_mem_fx[], /* i : OLA memory from last TCX/HQ frame Qx*/ + Word32 *output_fx, /* i/o: LB synth/upsampled LB synth Q4*/ + Word16 output_mem_fx[], /* i : OLA memory from last TCX/HQ frame Qx*/ #endif const Word16 use_cldfb_for_dft, /* i : flag to use of CLDFB for DFT Stereo Q0*/ const Word16 output_frame, /* i : frame length Q0*/ @@ -8291,7 +8291,21 @@ void tcx_hm_modify_envelope( Word32 env[], /* i/o: envelope Q16 */ Word16 L_frame /* i: number of spectral lines Q0 */ ); +#ifdef HARMONIZE_READ_DECODE_TNS +void ReadTnsData_fx( + STnsConfig const *pTnsConfig, + Decoder_State *st, + Word16 *pnBits, + Word16 *stream, + Word16 *pnSize ); + +Word16 DecodeTnsData_fx( + STnsConfig const *pTnsConfig, + Word16 const *stream, /*Q0*/ + Word16 *pnSize, /*Q0*/ + STnsData *pTnsData ); +#else Word16 ReadTnsData( STnsConfig const *pTnsConfig, Decoder_State *st, @@ -8318,6 +8332,7 @@ Word16 DecodeTnsData_ivas_fx( Word16 *pnSize, STnsData *pTnsData ); +#endif void GetParameters( ParamsBitMap const *paramsBitMap, const Word16 nParams, @@ -10981,12 +10996,6 @@ void EncodeTnsData( Word16 *pnBits /* o : number of written bits */ ); -Word16 DecodeTnsData_ivas( - STnsConfig const *pTnsConfig, - const Word16 *stream, - Word16 *pnSize, - STnsData *pTnsData ); - void WriteTnsData( const STnsConfig *pTnsConfig, /* i : TNS Configuration struct */ const Word16 *stream, /* i : internal data stream */ @@ -10994,7 +11003,7 @@ void WriteTnsData( BSTR_ENC_HANDLE hBstr, /* o : bitstream */ Word16 *pnBits /* o : number of written bits */ ); - +#ifndef HARMONIZE_READ_DECODE_TNS void ReadTnsData_ivas( STnsConfig const *pTnsConfig, Decoder_State *st, @@ -11002,6 +11011,13 @@ void ReadTnsData_ivas( Word16 *stream, Word16 *pnSize ); +Word16 DecodeTnsData_ivas( + STnsConfig const *pTnsConfig, + const Word16 *stream, + Word16 *pnSize, + STnsData *pTnsData ); + +#endif // HARMONIZE_READ_DECODE_TNS void analysisCldfbEncoder_ivas_fx( Encoder_State *st, /* i/o: encoder state structure */ Word32 *timeIn, /*q11*/ diff --git a/lib_dec/dec_prm_fx.c b/lib_dec/dec_prm_fx.c index 41a2e9842cd2657b9f28f019e4a75462e9e93f22..420c20dbfb65afb13addc582fa0acac280d00d82 100644 --- a/lib_dec/dec_prm_fx.c +++ b/lib_dec/dec_prm_fx.c @@ -394,7 +394,13 @@ void getTCXparam_fx( } ELSE { +#ifdef HARMONIZE_READ_DECODE_TNS + + ReadTnsData_fx( st->hTcxCfg->pCurrentTnsConfig, st0, &nTnsBits, prm + j, &nTnsParams ); +#else + ReadTnsData_ivas_fx( st->hTcxCfg->pCurrentTnsConfig, st0, &nTnsBits, prm + j, &nTnsParams ); +#endif // HARMONIZE_READ_DECODE_TNS } hTcxDec->tnsActive[k] = 0; // Q0 move16(); @@ -1351,7 +1357,11 @@ void dec_prm_fx( IF( st->hTcxCfg->fIsTNSAllowed ) { SetTnsConfig( st->hTcxCfg, 1, (Word16) EQ_16( st->last_core_from_bs, ACELP_CORE ) ); +#ifdef HARMONIZE_READ_DECODE_TNS + ReadTnsData_fx( st->hTcxCfg->pCurrentTnsConfig, st, &nTnsBits, prm + j, &nTnsParams ); +#else ReadTnsData( st->hTcxCfg->pCurrentTnsConfig, st, &nTnsBits, prm + j, &nTnsParams ); +#endif // HARMONIZE_READ_DECODE_TNS j = add( j, nTnsParams ); // Q0 } @@ -1675,8 +1685,13 @@ void dec_prm_fx( test(); test(); SetTnsConfig( st->hTcxCfg, 0, ( st->last_core_from_bs == ACELP_CORE ) && ( k == 0 ) ); - +#ifdef HARMONIZE_READ_DECODE_TNS + ReadTnsData_fx( st->hTcxCfg->pCurrentTnsConfig, st, &nTnsBits, prm + j, &nTnsParams ); +#else ReadTnsData( st->hTcxCfg->pCurrentTnsConfig, st, &nTnsBits, prm + j, &nTnsParams ); +#endif // DEBUG + + j = add( j, nTnsParams ); } diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 8482ef78b9c4ad53e51af924cd1bfcd8edce0db6..0b954c17c41712a68c250b803f9d1ea0431944ea 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -297,11 +297,17 @@ void decoder_tcx_fx( IF( ( bfi == 0 ) && ( hTcxCfg->fIsTNSAllowed != 0 ) ) { cast16(); - +#ifdef HARMONIZE_READ_DECODE_TNS + fUseTns = (Word8) DecodeTnsData_fx( hTcxCfg->pCurrentTnsConfig, + prm_tns, + &tnsSize, + &tnsData ); +#else fUseTns = (Word8) DecodeTnsData( hTcxCfg->pCurrentTnsConfig, prm_tns, &tnsSize, &tnsData ); +#endif // HARMONIZE_READ_DECODE_TNS } ELSE { @@ -4200,7 +4206,12 @@ void decoder_tcx_invQ_fx( test(); IF( !bfi && hTcxCfg->fIsTNSAllowed ) { +#ifdef HARMONIZE_READ_DECODE_TNS + *fUseTns = DecodeTnsData_fx( hTcxCfg->pCurrentTnsConfig, prm_tns, &tnsSize, tnsData ); +#else *fUseTns = DecodeTnsData_ivas_fx( hTcxCfg->pCurrentTnsConfig, prm_tns, &tnsSize, tnsData ); +#endif // HARMONIZE_READ_DECODE_TNS + move16(); } ELSE diff --git a/lib_dec/tns_base_dec_fx.c b/lib_dec/tns_base_dec_fx.c index e245a4674acca3a9eed93f2b189caec8036ade81..44d18ccb2a4dda6daaee40b9b6266bf0fd4473e8 100644 --- a/lib_dec/tns_base_dec_fx.c +++ b/lib_dec/tns_base_dec_fx.c @@ -21,6 +21,119 @@ typedef Word32 ( *TLinearPredictionFilter )( Word16 order, Word16 const parCoeff /********************************/ /* Interface functions */ /********************************/ + + +#ifdef HARMONIZE_READ_DECODE_TNS +/*---------------------------------------------------------------------* + * ReadTnsData() + * + * + *---------------------------------------------------------------------*/ +void ReadTnsData_fx( + STnsConfig const *pTnsConfig, + Decoder_State *st, + Word16 *pnBits, /*Q0*/ + Word16 *stream, /*Q0*/ + Word16 *pnSize /*Q0*/ +) +{ + Word16 start_bit_pos; + + move16(); + start_bit_pos = st->next_bit_pos; + + IF( GT_16( pTnsConfig->nMaxFilters, 1 ) ) + { + IF( pTnsConfig->allowTnsOnWhite ) + { + IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) + { + ReadFromBitstream_fx( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, st, &stream, pnSize ); + } + ELSE + { + ReadFromBitstream_fx( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, st, &stream, pnSize ); + } + } + ELSE + { + + IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) + { + ReadFromBitstream_fx( &tnsEnabledSWBTCX10BitMap, 1, st, &stream, pnSize ); + } + ELSE + { + ReadFromBitstream_fx( &tnsEnabledSWBTCX20BitMap, 1, st, &stream, pnSize ); + } + } + } + ELSE + { + ReadFromBitstream_fx( &tnsEnabledWBTCX20BitMap, 1, st, &stream, pnSize ); + } + + move16(); + *pnBits = sub( st->next_bit_pos, start_bit_pos ); +} + +/*---------------------------------------------------------------------* + * DecodeTnsData() + * + * + *---------------------------------------------------------------------*/ +Word16 DecodeTnsData_fx( + STnsConfig const *pTnsConfig, + Word16 const *stream, /*Q0*/ + Word16 *pnSize, /*Q0*/ + STnsData *pTnsData ) +{ + Word16 result; + + ResetTnsData( pTnsData ); + + IF( GT_16( pTnsConfig->nMaxFilters, 1 ) ) + { + + IF( pTnsConfig->allowTnsOnWhite ) + { + IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) + { + SetParameters_fx( &tnsEnabledOnWhiteSWBTCX10BitMap, 1, pTnsData, &stream, pnSize ); + } + ELSE + { + SetParameters_fx( &tnsEnabledOnWhiteSWBTCX20BitMap, 1, pTnsData, &stream, pnSize ); + } + } + ELSE + { + + IF( LT_16( pTnsConfig->iFilterBorders[0], 512 ) ) + { + SetParameters_fx( &tnsEnabledSWBTCX10BitMap, 1, pTnsData, &stream, pnSize ); + } + ELSE + { + SetParameters_fx( &tnsEnabledSWBTCX20BitMap, 1, pTnsData, &stream, pnSize ); + } + } + } + ELSE + { + SetParameters_fx( &tnsEnabledWBTCX20BitMap, 1, pTnsData, &stream, pnSize ); + } + + move16(); + result = FALSE; + if ( pTnsData->nFilters > 0 ) + { + move16(); + result = TRUE; + } + return result; +} +#else /*---------------------------------------------------------------------* * ReadTnsData() * @@ -216,3 +329,6 @@ Word16 DecodeTnsData_ivas_fx( return result; } + + +#endif // HARMONIZE_READ_DECODE_TNS