Commit 8f88afc0 authored by reutelhuber's avatar reutelhuber
Browse files

fix asan error connected to CPE de-/allocation during bitrate switching

parent 1de9422f
Loading
Loading
Loading
Loading
Loading
+37 −3
Original line number Diff line number Diff line
@@ -90,8 +90,13 @@ ivas_error ivas_corecoder_dec_reconfig(
     *-----------------------------------------------------------------*/

    /* remove dummy CPE element for DFT stereo-like upmix */
#ifdef SBA2MONO
    if ( ( st_ivas->ivas_format == SBA_FORMAT && sba_dirac_stereo_flag_old && nchan_transport_old == 1 && ( !st_ivas->sba_dirac_stereo_flag || st_ivas->nchan_transport > 1 ) ) ||
         ( st_ivas->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && sba_dirac_stereo_flag_old && nchan_transport_old == 1 && ( !st_ivas->sba_dirac_stereo_flag || st_ivas->nchan_transport > 1 ) ) )
#else
    if ( ( st_ivas->ivas_format == SBA_FORMAT && sba_dirac_stereo_flag_old && !st_ivas->sba_dirac_stereo_flag ) ||
         ( st_ivas->ivas_format == MC_FORMAT && last_mc_mode == MC_MODE_MCMASA && sba_dirac_stereo_flag_old && !st_ivas->sba_dirac_stereo_flag ) )
#endif
    {
        st_ivas->hCPE[0]->hCoreCoder[0] = NULL;
        st_ivas->hCPE[0]->hCoreCoder[1] = NULL;
@@ -150,9 +155,19 @@ ivas_error ivas_corecoder_dec_reconfig(
        for ( cpe_id = st_ivas->nCPE; cpe_id < nCPE_old; cpe_id++ )
        {
#ifdef SBA2MONO
            /* don't deallocate first CPE in case of mono/stereo output of 1 TC SBA */
            if ( cpe_id == 0 && st_ivas->sba_dirac_stereo_flag )
            /* don't deallocate first CPE in case of mono/stereo output of 1 TC SBA, only deallocate core coder */
            if ( cpe_id == 0 && st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old )
            {
                for ( n = 0; n < CPE_CHANNELS; n++ )
                {
                    if ( st_ivas->hCPE[cpe_id]->hCoreCoder[n] != NULL )
                    {
                        destroy_core_dec( st_ivas->hCPE[cpe_id]->hCoreCoder[n] );

                        free( st_ivas->hCPE[cpe_id]->hCoreCoder[n] );
                        st_ivas->hCPE[cpe_id]->hCoreCoder[n] = NULL;
                    }
                }
                continue;
            }
#endif
@@ -196,7 +211,7 @@ ivas_error ivas_corecoder_dec_reconfig(
            }
        }
#ifdef SBA2MONO
        if ( st_ivas->sba_dirac_stereo_flag && st_ivas->nchan_transport == 1 && nchan_transport_old > 1 )
        if ( st_ivas->sba_dirac_stereo_flag && sba_dirac_stereo_flag_old && st_ivas->nchan_transport == 1 && nSCE_old == 0 )
        {
            st_ivas->hCPE[0]->hCoreCoder[0] = st_ivas->hSCE[0]->hCoreCoder[0]; /* don't allocate unnecessary core coder, simply point to core coder of SCE element */
            st_ivas->hCPE[0]->hCoreCoder[1] = NULL;
@@ -280,10 +295,29 @@ ivas_error ivas_corecoder_dec_reconfig(
    if ( ( st_ivas->ivas_format == SBA_FORMAT && st_ivas->sba_dirac_stereo_flag && !sba_dirac_stereo_flag_old ) ||
         ( st_ivas->ivas_format == MC_FORMAT && st_ivas->mc_mode == MC_MODE_MCMASA && st_ivas->sba_dirac_stereo_flag && !sba_dirac_stereo_flag_old ) )
    {
#ifdef SBA2MONO
        /* if at least one CPE is already available, only allocate DFT Stereo struct */
        if ( st_ivas->nCPE > 0 )
        {
            if ( ( error = stereo_dft_dec_create( &(st_ivas->hCPE[0]->hStereoDft ), st_ivas->hCPE[0]->element_brate, st_ivas->hDecoderConfig->output_Fs, st_ivas->sba_dirac_stereo_flag, st_ivas->nchan_transport ) ) != IVAS_ERR_OK )
            {
                return error;
            }
        }
        /* otherwise create extra dummy CPE */
        else
        {
            if ( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK )
            {
                return error;
            }
        }
#else
        if ( ( error = create_cpe_dec( st_ivas, 0, ivas_total_brate / ( st_ivas->nSCE + st_ivas->nCPE ) ) ) != IVAS_ERR_OK )
        {
            return error;
        }
#endif

        // VE: TBV - just reset for now
        set_f( st_ivas->hCPE[0]->hStereoDft->buff_LBTCX_mem, 0, NS2SA( 16000, STEREO_DFT32MS_OVL_NS ) );