Commit c82521e5 authored by multrus's avatar multrus
Browse files

modify accumulateCLDFBArrayToBuffer_fx() to take different scalings into account

parent 60270af3
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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 ########################### */

+73 −1
Original line number Diff line number Diff line
@@ -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],
@@ -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,
@@ -469,6 +516,7 @@ static void copyBufferTo2dArray_fx(

    return;
}

static void accumulate2dArrayToBuffer_fx(
    Word32 array[][L_FRAME48k],
    const IVAS_REND_AudioBuffer *buffer )
@@ -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;
                    }
@@ -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
    {
@@ -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
    {
@@ -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
    {
@@ -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
        {
@@ -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;