Commit ad34cd96 authored by Archit Tamarapu's avatar Archit Tamarapu
Browse files

[fix] proper merge resolution for FIX_835_PARAMMC_BUFFER_VALUES

parent 2e094dac
Loading
Loading
Loading
Loading
Loading
+204 −91
Original line number Diff line number Diff line
@@ -1332,6 +1332,9 @@ void ivas_param_mc_dec_digest_tc(
{
    PARAM_MC_DEC_HANDLE hParamMC;
    int16_t ch;
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
    int16_t is_next_band, skip_next_band;
#endif
    int16_t slot_idx;
    int16_t nchan_transport;

@@ -1339,8 +1342,16 @@ void ivas_param_mc_dec_digest_tc(
    int16_t nchan_out_transport, nchan_out_cldfb, i, param_band_idx;
    int16_t nchan_out_cov;
    /*CLDFB*/
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
    float *pCx, *pCx_imag;
    float cx[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
    float cx_imag[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
    float cx_next_band[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
    float cx_imag_next_band[PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
#else
    float cx[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
    float cx_imag[PARAM_MC_MAX_PARAMETER_BANDS][PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS];
#endif
    float real_part, imag_part;
    /* format converter */
    int16_t channel_active[MAX_OUTPUT_CHANNELS];
@@ -1402,11 +1413,25 @@ void ivas_param_mc_dec_digest_tc(

    ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator );


#ifdef FIX_835_PARAMMC_BUFFER_VALUES
    /* loop over two bands at a time */
    for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 )
    {
        /* don't process next band if it exceeds the limit */
        skip_next_band = ( ( param_band_idx + 1 ) == hParamMC->num_param_bands_synth ) ? 1 : 0;

        set_zero( cx, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
        set_zero( cx_imag, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
        set_zero( cx_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
        set_zero( cx_imag_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
#else
    for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ )
    {
        set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
        set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
    }
#endif
#endif

        /* slot loop for gathering the input data */
@@ -1414,6 +1439,10 @@ void ivas_param_mc_dec_digest_tc(
        {
            if ( st_ivas->hDecoderConfig->Opt_tsm )
            {
#if defined( FIX_835_PARAMMC_BUFFER_VALUES ) && !defined( OBJ_EDITING_API )
                if ( param_band_idx == 0 ) /* only run cldfbAna once */
                {
#endif
                    float RealBuffer[CLDFB_NO_CHANNELS_MAX];
                    float ImagBuffer[CLDFB_NO_CHANNELS_MAX];

@@ -1425,32 +1454,84 @@ void ivas_param_mc_dec_digest_tc(
                        mvr2r( RealBuffer, &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands );
                        mvr2r( ImagBuffer, &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport + ch * hParamMC->num_freq_bands], hParamMC->num_freq_bands );
                    }
#if defined( FIX_835_PARAMMC_BUFFER_VALUES ) && !defined( OBJ_EDITING_API )
                }
#endif
            }
#ifndef OBJ_EDITING_API
            if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex )
            {
            ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport );
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                for ( is_next_band = 0; is_next_band < 2; is_next_band++ )
                {
                    if ( is_next_band && skip_next_band )
                    {
                        continue;
                    }
#endif
                    ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport],
                                                                               &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport],
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                                                                               is_next_band ? cx_next_band : cx,
                                                                               is_next_band ? cx_imag_next_band : cx_imag,
                                                                               param_band_idx + is_next_band,
#else
                                                                       cx,
                                                                       cx_imag,
#endif
                                                                               hParamMC,
                                                                               nchan_transport );
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                }
#endif
            }
#endif
        }

#ifndef OBJ_EDITING_API
        /* map from complex input covariance to real values */
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
        for ( is_next_band = 0; is_next_band < 2; is_next_band++ )
        {
            if ( is_next_band && skip_next_band )
            {
                continue;
            }
#else
    for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ )
    {
#endif
            /* Cx for transport channels */
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
            pCx = is_next_band ? &cx_next_band[0] : &cx[0];
            pCx_imag = is_next_band ? &cx_imag_next_band[0] : &cx_imag[0];
#endif
            for ( i = 0; i < nchan_transport * nchan_transport; i++ )
            {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                real_part = pCx[i];
                imag_part = pCx_imag[i];
#else
            real_part = cx[param_band_idx][i];
            imag_part = cx_imag[param_band_idx][i];
#endif

                /* (a-ib)(c+id) = ac + bd + i(ad-bc) */
                if ( param_band_idx < hParamMC->max_param_band_abs_cov )
                {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                    pCx[i] = sqrtf( real_part * real_part + imag_part * imag_part );
#else
                cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part );
#endif
                }
                else
                {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                    pCx[i] = real_part;
#else
                cx[param_band_idx][i] = real_part;
#endif
                }
            }
        }
@@ -1458,16 +1539,45 @@ void ivas_param_mc_dec_digest_tc(
        /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/
        if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) )
        {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
            v_add( cx, cx_next_band, cx, nchan_transport * nchan_transport );
            mvr2r( cx, cx_next_band, nchan_transport * nchan_transport );
#else
        for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 )
        {
            v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport );
            mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport );
        }
#endif
        }


#ifdef FIX_835_PARAMMC_BUFFER_VALUES
        for ( is_next_band = 0; is_next_band < 2; is_next_band++ )
        {
            if ( is_next_band && skip_next_band )
            {
                continue;
            }
#endif
            /* generate mixing matrices */
    ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov );
            ivas_param_mc_get_mixing_matrices( hParamMC,
                                               hSynthesisOutputSetup,
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                                               is_next_band ? cx_next_band : cx,
                                               param_band_idx + is_next_band,
#else
                                       cx,
#endif
                                               hParamMC->h_output_synthesis_cov_state.mixing_matrix,
                                               hParamMC->h_output_synthesis_cov_state.mixing_matrix_res,
                                               nchan_out_transport,
                                               hParamMC->synthesis_conf,
                                               nchan_transport,
                                               nchan_out_cov );
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
        }
    }
#endif
#endif
    pop_wmops();

@@ -1562,6 +1672,7 @@ void ivas_param_mc_dec_prepare_renderer(

    ivas_param_mc_dec_compute_interpolator( hParamMC->hMetadataPMC->bAttackPresent, hParamMC->hMetadataPMC->attackIndex, nCldfbSlots, hParamMC->h_output_synthesis_params.interpolator );


#ifdef FIX_835_PARAMMC_BUFFER_VALUES
    /* loop over two bands at a time */
    for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 )
@@ -1573,133 +1684,134 @@ void ivas_param_mc_dec_prepare_renderer(
        set_zero( cx_imag, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
        set_zero( cx_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
        set_zero( cx_imag_next_band, PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
#else
    for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ )
    {
        set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
        set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
    }
#endif

        /* slot loop for gathering the input data */
        for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ )
        {
            if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex )
            {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                for ( is_next_band = 0; is_next_band < 2; is_next_band++ )
                {
                    if ( is_next_band && skip_next_band )
                    {
                        continue;
                    }

#endif
                    ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport],
                                                                               &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport],
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                                                                               is_next_band ? cx_next_band : cx,
                                                                               is_next_band ? cx_imag_next_band : cx_imag,
                                                                               param_band_idx + is_next_band,
#else
                                                                       cx,
                                                                       cx_imag,
#endif
                                                                               hParamMC,
                                                                               nchan_transport );
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                }
#endif
            }
        }

        /* map from complex input covariance to real values */
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
        for ( is_next_band = 0; is_next_band < 2; is_next_band++ )
        {
            if ( is_next_band && skip_next_band )
            {
                continue;
            }

#else
    for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ )
    {
#endif
            /* Cx for transport channels */
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
            pCx = is_next_band ? &cx_next_band[0] : &cx[0];
            pCx_imag = is_next_band ? &cx_imag_next_band[0] : &cx_imag[0];

#endif
            for ( i = 0; i < nchan_transport * nchan_transport; i++ )
            {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                real_part = pCx[i];
                imag_part = pCx_imag[i];
#else
            real_part = cx[param_band_idx][i];
            imag_part = cx_imag[param_band_idx][i];
#endif

                /* (a-ib)(c+id) = ac + bd + i(ad-bc) */
                if ( param_band_idx < hParamMC->max_param_band_abs_cov )
                {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                    pCx[i] = sqrtf( real_part * real_part + imag_part * imag_part );
#else
                cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part );
#endif
                }
                else
                {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                    pCx[i] = real_part;
#else
                cx[param_band_idx][i] = real_part;
#endif
                }
            }
        }


        /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/
        if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) )
        {
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
            v_add( cx, cx_next_band, cx, nchan_transport * nchan_transport );
            mvr2r( cx, cx_next_band, nchan_transport * nchan_transport );
#else
        for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 )
        {
            v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport );
            mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport );
        }
#endif
        }


#ifdef FIX_835_PARAMMC_BUFFER_VALUES
        for ( is_next_band = 0; is_next_band < 2; is_next_band++ )
        {
            if ( is_next_band && skip_next_band )
            {
                continue;
            }

#endif
            /* generate mixing matrices */
            ivas_param_mc_get_mixing_matrices( hParamMC,
                                               hSynthesisOutputSetup,
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
                                               is_next_band ? cx_next_band : cx,
                                               param_band_idx + is_next_band,
#else
                                       cx,
#endif
                                               hParamMC->h_output_synthesis_cov_state.mixing_matrix,
                                               hParamMC->h_output_synthesis_cov_state.mixing_matrix_res,
                                               nchan_out_transport,
                                               hParamMC->synthesis_conf,
                                               nchan_transport,
                                               nchan_out_cov );
#ifdef FIX_835_PARAMMC_BUFFER_VALUES
        }
    }
#else
    for ( param_band_idx = 0; param_band_idx < PARAM_MC_MAX_PARAMETER_BANDS; param_band_idx++ )
    {
        set_zero( cx[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
        set_zero( cx_imag[param_band_idx], PARAM_MC_MAX_TRANSPORT_CHANS * PARAM_MC_MAX_TRANSPORT_CHANS );
    }

    /* slot loop for gathering the input data */
    for ( slot_idx = 0; slot_idx < nCldfbSlots; slot_idx++ )
    {
        if ( slot_idx >= 2 * hParamMC->hMetadataPMC->attackIndex )
        {
            ivas_dirac_dec_output_synthesis_cov_param_mc_collect_slot( &hParamMC->Cldfb_RealBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], &hParamMC->Cldfb_ImagBuffer_tc[slot_idx * hParamMC->num_freq_bands * nchan_transport], cx, cx_imag, hParamMC, nchan_transport );
        }
    }

    /* map from complex input covariance to real values */
    for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx++ )
    {
        /* Cx for transport channels */
        for ( i = 0; i < nchan_transport * nchan_transport; i++ )
        {
            real_part = cx[param_band_idx][i];
            imag_part = cx_imag[param_band_idx][i];

            /* (a-ib)(c+id) = ac + bd + i(ad-bc) */
            if ( param_band_idx < hParamMC->max_param_band_abs_cov )
            {
                cx[param_band_idx][i] = sqrtf( real_part * real_part + imag_part * imag_part );
            }
            else
            {
                cx[param_band_idx][i] = real_part;
            }
        }
    }

    /* we have to do it similar to the encoder in case of attacks (i.e. accumulate two bands) to ensure correct DMX of the target covariance*/
    if ( hParamMC->hMetadataPMC->bAttackPresent && ( hParamMC->synthesis_conf == PARAM_MC_SYNTH_LS_CONV_COV || hParamMC->synthesis_conf == PARAM_MC_SYNTH_MONO_STEREO ) )
    {
        for ( param_band_idx = 0; param_band_idx < hParamMC->num_param_bands_synth; param_band_idx += 2 )
        {
            v_add( cx[param_band_idx], cx[param_band_idx + 1], cx[param_band_idx], nchan_transport * nchan_transport );
            mvr2r( cx[param_band_idx], cx[param_band_idx + 1], nchan_transport * nchan_transport );
        }
    }


    /* generate mixing matrices */
    ivas_param_mc_get_mixing_matrices( hParamMC, hSynthesisOutputSetup, cx, hParamMC->h_output_synthesis_cov_state.mixing_matrix, hParamMC->h_output_synthesis_cov_state.mixing_matrix_res, nchan_out_transport, hParamMC->synthesis_conf, nchan_transport, nchan_out_cov );
#endif

    pop_wmops();
@@ -1708,6 +1820,7 @@ void ivas_param_mc_dec_prepare_renderer(
}
#endif


/*-------------------------------------------------------------------------
 * ivas_param_mc_dec_render()
 *