Loading lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ #define FIX_2283_ISM_MD_DELAY /* Dolby: Fix ISM metadata delay round-off */ #define FIX_2283_Q_CLDFB /* FhG: Fix Q format issue in CLDFB */ #define FIX_2283_ACCU_CLDFB /* FhG: Fix to consider Q-format differences in accumulateCLDFBArrayToBuffer_fx() */ /* ##################### End NON-BE switches ########################### */ Loading lib_rend/lib_rend_fx.c +73 −1 Original line number Diff line number Diff line Loading @@ -413,6 +413,7 @@ static void copyBufferToCLDFBarray_fx( return; } #ifndef FIX_2283_ACCU_CLDFB static void accumulateCLDFBArrayToBuffer_fx( Word32 re[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 im[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Loading Loading @@ -445,6 +446,52 @@ static void accumulateCLDFBArrayToBuffer_fx( return; } #else static void accumulateCLDFBArrayToBuffer_fx( Word32 re[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 im[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word16 Q_new, const IVAS_REND_AudioBuffer *buffer ) { UWord32 smplIdx, slotIdx; UWord32 numCldfbSamples, num_bands; Word16 chnlIdx; Word32 *writePtr; Word16 Q_old, Q_diff; Q_old = *(buffer->pq_fact); move16(); Q_diff = sub( Q_new, Q_old ); assert( ( buffer->config.is_cldfb == 1 ) && "for time domain input call copyBufferTo2dArray()" ); writePtr = buffer->data_fx; numCldfbSamples = (UWord32) shr( buffer->config.numSamplesPerChannel, 1 ); num_bands = (UWord32) Mpy_32_32( numCldfbSamples, ONE_BY_CLDFB_NO_COL_MAX_Q31 ); FOR( chnlIdx = 0; chnlIdx < buffer->config.numChannels; ++chnlIdx ) { FOR( slotIdx = 0; slotIdx < CLDFB_NO_COL_MAX; ++slotIdx ) { FOR( smplIdx = 0; smplIdx < num_bands; ++smplIdx ) { *writePtr = L_add( L_shl( *writePtr, Q_diff ), re[chnlIdx][slotIdx][smplIdx] ); writePtr++; } FOR( smplIdx = 0; smplIdx < num_bands; ++smplIdx ) { *writePtr = L_add( L_shl( *writePtr, Q_diff ), im[chnlIdx][slotIdx][smplIdx] ); writePtr++; } } } *(buffer->pq_fact) = Q_new; move16(); return; } #endif static void copyBufferTo2dArray_fx( const IVAS_REND_AudioBuffer buffer, Loading @@ -469,6 +516,7 @@ static void copyBufferTo2dArray_fx( return; } static void accumulate2dArrayToBuffer_fx( Word32 array[][L_FRAME48k], const IVAS_REND_AudioBuffer *buffer ) Loading Loading @@ -7137,8 +7185,13 @@ static ivas_error renderIsmToSplitBinaural( FOR( Word16 j = 0; j < noChannels; j++ ) { #ifdef FIX_2283_ACCU_CLDFB realBuffer_fx[j] = L_shl( realBuffer_fx[j], sub( exp, q_cldfb ) ); /*Q(exp)*/ imagBuffer_fx[j] = L_shl( imagBuffer_fx[j], sub( exp, q_cldfb ) ); /*Q(exp)*/ #else realBuffer_fx[j] = L_shl( realBuffer_fx[j], sub( sub( exp, q_cldfb ), 1 ) ); /*Q(exp)*/ imagBuffer_fx[j] = L_shl( imagBuffer_fx[j], sub( sub( exp, q_cldfb ), 1 ) ); /*Q(exp)*/ #endif } q_cldfb = exp; } Loading Loading @@ -7167,7 +7220,11 @@ static ivas_error renderIsmToSplitBinaural( if ( outAudio.config.is_cldfb ) { #ifdef FIX_2283_ACCU_CLDFB accumulateCLDFBArrayToBuffer_fx( tmpBinaural_CldfbRe, tmpBinaural_CldfbIm, exp, &outAudio ); #else accumulateCLDFBArrayToBuffer_fx( tmpBinaural_CldfbRe, tmpBinaural_CldfbIm, &outAudio ); #endif } else { Loading Loading @@ -8391,7 +8448,11 @@ static ivas_error renderSbaToSplitBinaural( return error; } #ifdef FIX_2283_ACCU_CLDFB accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, *outAudio.pq_fact, &outAudio ); #else accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); #endif } ELSE { Loading Loading @@ -8441,7 +8502,11 @@ static ivas_error renderSbaToBinaural( return error; } #ifdef FIX_2283_ACCU_CLDFB accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, *outAudio.pq_fact, &outAudio ); #else accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); #endif } ELSE { Loading Loading @@ -9112,10 +9177,14 @@ static ivas_error renderInputMasa( ivas_masa_ext_rend_parambin_render_fx( masaInput->hMasaExtRend, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer_fx, num_subframes, masaInput->base.ctx.pSplitRendWrapper, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural ); #ifdef FIX_2283_ACCU_CLDFB accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Q6, &outAudio ); #else accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); *outAudio.pq_fact = Q6; move16(); #endif } ELSE { Loading Loading @@ -9549,14 +9618,17 @@ static ivas_error getSamplesInternal( { return error; } IF( NE_32( ( error = renderActiveInputsMc( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) { return error; } IF( NE_32( ( error = renderActiveInputsSba( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) { return error; } IF( NE_32( ( error = renderActiveInputsMasa( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) { return error; Loading Loading
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -100,6 +100,7 @@ #define FIX_2283_ISM_MD_DELAY /* Dolby: Fix ISM metadata delay round-off */ #define FIX_2283_Q_CLDFB /* FhG: Fix Q format issue in CLDFB */ #define FIX_2283_ACCU_CLDFB /* FhG: Fix to consider Q-format differences in accumulateCLDFBArrayToBuffer_fx() */ /* ##################### End NON-BE switches ########################### */ Loading
lib_rend/lib_rend_fx.c +73 −1 Original line number Diff line number Diff line Loading @@ -413,6 +413,7 @@ static void copyBufferToCLDFBarray_fx( return; } #ifndef FIX_2283_ACCU_CLDFB static void accumulateCLDFBArrayToBuffer_fx( Word32 re[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 im[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Loading Loading @@ -445,6 +446,52 @@ static void accumulateCLDFBArrayToBuffer_fx( return; } #else static void accumulateCLDFBArrayToBuffer_fx( Word32 re[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word32 im[][CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX], Word16 Q_new, const IVAS_REND_AudioBuffer *buffer ) { UWord32 smplIdx, slotIdx; UWord32 numCldfbSamples, num_bands; Word16 chnlIdx; Word32 *writePtr; Word16 Q_old, Q_diff; Q_old = *(buffer->pq_fact); move16(); Q_diff = sub( Q_new, Q_old ); assert( ( buffer->config.is_cldfb == 1 ) && "for time domain input call copyBufferTo2dArray()" ); writePtr = buffer->data_fx; numCldfbSamples = (UWord32) shr( buffer->config.numSamplesPerChannel, 1 ); num_bands = (UWord32) Mpy_32_32( numCldfbSamples, ONE_BY_CLDFB_NO_COL_MAX_Q31 ); FOR( chnlIdx = 0; chnlIdx < buffer->config.numChannels; ++chnlIdx ) { FOR( slotIdx = 0; slotIdx < CLDFB_NO_COL_MAX; ++slotIdx ) { FOR( smplIdx = 0; smplIdx < num_bands; ++smplIdx ) { *writePtr = L_add( L_shl( *writePtr, Q_diff ), re[chnlIdx][slotIdx][smplIdx] ); writePtr++; } FOR( smplIdx = 0; smplIdx < num_bands; ++smplIdx ) { *writePtr = L_add( L_shl( *writePtr, Q_diff ), im[chnlIdx][slotIdx][smplIdx] ); writePtr++; } } } *(buffer->pq_fact) = Q_new; move16(); return; } #endif static void copyBufferTo2dArray_fx( const IVAS_REND_AudioBuffer buffer, Loading @@ -469,6 +516,7 @@ static void copyBufferTo2dArray_fx( return; } static void accumulate2dArrayToBuffer_fx( Word32 array[][L_FRAME48k], const IVAS_REND_AudioBuffer *buffer ) Loading Loading @@ -7137,8 +7185,13 @@ static ivas_error renderIsmToSplitBinaural( FOR( Word16 j = 0; j < noChannels; j++ ) { #ifdef FIX_2283_ACCU_CLDFB realBuffer_fx[j] = L_shl( realBuffer_fx[j], sub( exp, q_cldfb ) ); /*Q(exp)*/ imagBuffer_fx[j] = L_shl( imagBuffer_fx[j], sub( exp, q_cldfb ) ); /*Q(exp)*/ #else realBuffer_fx[j] = L_shl( realBuffer_fx[j], sub( sub( exp, q_cldfb ), 1 ) ); /*Q(exp)*/ imagBuffer_fx[j] = L_shl( imagBuffer_fx[j], sub( sub( exp, q_cldfb ), 1 ) ); /*Q(exp)*/ #endif } q_cldfb = exp; } Loading Loading @@ -7167,7 +7220,11 @@ static ivas_error renderIsmToSplitBinaural( if ( outAudio.config.is_cldfb ) { #ifdef FIX_2283_ACCU_CLDFB accumulateCLDFBArrayToBuffer_fx( tmpBinaural_CldfbRe, tmpBinaural_CldfbIm, exp, &outAudio ); #else accumulateCLDFBArrayToBuffer_fx( tmpBinaural_CldfbRe, tmpBinaural_CldfbIm, &outAudio ); #endif } else { Loading Loading @@ -8391,7 +8448,11 @@ static ivas_error renderSbaToSplitBinaural( return error; } #ifdef FIX_2283_ACCU_CLDFB accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, *outAudio.pq_fact, &outAudio ); #else accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); #endif } ELSE { Loading Loading @@ -8441,7 +8502,11 @@ static ivas_error renderSbaToBinaural( return error; } #ifdef FIX_2283_ACCU_CLDFB accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, *outAudio.pq_fact, &outAudio ); #else accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); #endif } ELSE { Loading Loading @@ -9112,10 +9177,14 @@ static ivas_error renderInputMasa( ivas_masa_ext_rend_parambin_render_fx( masaInput->hMasaExtRend, *masaInput->base.ctx.pCombinedOrientationData, tmpBuffer_fx, num_subframes, masaInput->base.ctx.pSplitRendWrapper, Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural ); #ifdef FIX_2283_ACCU_CLDFB accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, Q6, &outAudio ); #else accumulateCLDFBArrayToBuffer_fx( Cldfb_RealBuffer_Binaural, Cldfb_ImagBuffer_Binaural, &outAudio ); *outAudio.pq_fact = Q6; move16(); #endif } ELSE { Loading Loading @@ -9549,14 +9618,17 @@ static ivas_error getSamplesInternal( { return error; } IF( NE_32( ( error = renderActiveInputsMc( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) { return error; } IF( NE_32( ( error = renderActiveInputsSba( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) { return error; } IF( NE_32( ( error = renderActiveInputsMasa( hIvasRend, outAudio ) ), IVAS_ERR_OK ) ) { return error; Loading