diff --git a/lib_com/options.h b/lib_com/options.h index 0ea316a82a8cdacb4562394ba7ad6b5cd236a9bd..400b3fa163825c786f9660d96f6df97b3a0ef4f2 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -109,7 +109,7 @@ #define FIX_2391_INIT_HQ_GENERIC_OFFSET /* FhG/Eri: basop issue 2391: make sure hq_generic_offset is initialized inside hq_hr_dec_fx() */ #define FIX_2397_COPY_AQ_MDCT_CORE_BFI /* FhG: prevent copying of uninit memory in MDCT stereo core if bfi is set */ #define HARMONIZE_TBE /* VA: harmonize core-coder TBE function duplications */ - +#define HARMONIZE_READ_DECODE_TNS /* FhG: issue 2389: Harmonization of two pairs ReadTnsData() and DecodeTnsData()*/ /* #################### End BE switches ################################## */ /* #################### Start NON-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 c45c2a7490d98886919391ee55e3dcb80560eff0..baa38d4cfbd16420a5f5f8d5e615f528e590c646 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -8375,7 +8375,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 +Word16 ReadTnsData( + STnsConfig const *pTnsConfig, + Decoder_State *st, + Word16 *pnBits, + Word16 *stream, + Word16 *pnSize ); +Word16 DecodeTnsData( + STnsConfig const *pTnsConfig, + Word16 const *stream, /*Q0*/ + Word16 *pnSize, /*Q0*/ + STnsData *pTnsData ); + +#else Word16 ReadTnsData( STnsConfig const *pTnsConfig, Decoder_State *st, @@ -8402,6 +8416,7 @@ Word16 DecodeTnsData_ivas_fx( Word16 *pnSize, STnsData *pTnsData ); +#endif void GetParameters( ParamsBitMap const *paramsBitMap, const Word16 nParams, @@ -11062,12 +11077,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 */ @@ -11075,7 +11084,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, @@ -11083,6 +11092,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..853ac4222d1341c75ab7f0dd63e172224fbce32e 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 + + (void) ReadTnsData( 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 + (void) ReadTnsData( 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 + (void) ReadTnsData( 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 ed170d5982cf679da5651bb1eb9ef3adc4683609..534d342756de37f149fb028bb0d39dea02c06dee 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -4204,7 +4204,7 @@ void decoder_tcx_invQ_fx( test(); IF( !bfi && hTcxCfg->fIsTNSAllowed ) { - *fUseTns = DecodeTnsData_ivas_fx( hTcxCfg->pCurrentTnsConfig, prm_tns, &tnsSize, tnsData ); + *fUseTns = DecodeTnsData( hTcxCfg->pCurrentTnsConfig, prm_tns, &tnsSize, tnsData ); move16(); } ELSE diff --git a/lib_dec/tns_base_dec_fx.c b/lib_dec/tns_base_dec_fx.c index e245a4674acca3a9eed93f2b189caec8036ade81..42fd51df7e0bc986f8a141f0668a41c5d28a544e 100644 --- a/lib_dec/tns_base_dec_fx.c +++ b/lib_dec/tns_base_dec_fx.c @@ -21,6 +21,120 @@ typedef Word32 ( *TLinearPredictionFilter )( Word16 order, Word16 const parCoeff /********************************/ /* Interface functions */ /********************************/ + + +#ifdef HARMONIZE_READ_DECODE_TNS +/*---------------------------------------------------------------------* + * ReadTnsData() + * + * + *---------------------------------------------------------------------*/ +Word16 ReadTnsData( + 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 ); + + return TNS_NO_ERROR; +} +/*---------------------------------------------------------------------* + * DecodeTnsData() + * + * + *---------------------------------------------------------------------*/ +Word16 DecodeTnsData( + 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 +330,6 @@ Word16 DecodeTnsData_ivas_fx( return result; } + + +#endif // HARMONIZE_READ_DECODE_TNS