Commit 10e3b123 authored by Vidhya V P's avatar Vidhya V P
Browse files

Modified ivas_dirac_enc()

[x] Moved the DiRAC encoding functions from ivas_spar_enc_process()
parent 2188b6a9
Loading
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -3339,6 +3339,18 @@ void ivas_dirac_enc(
    const int16_t input_frame,                                  /* i  : input frame length                      */
    const int16_t sba_planar                                    /* i  : SBA planar flag                         */
);
#else
void ivas_dirac_enc(
    DIRAC_ENC_HANDLE hDirAC,                                   /* i/o: encoder DirAC handle                  */
    IVAS_QMETADATA_HANDLE hQMetaData,                          /* i/o: q_metadata handle                     */
    BSTR_ENC_HANDLE hMetaData,                                 /* i/o: Metadata bitstream handle             */
    float data_f[][L_FRAME48k],                                /* i/o: SBA channels                          */
    float **ppIn_FR_real,                                      /* o  : real freq domain values               */
    float **ppIn_FR_imag,                                      /* o  : imag freq domain values               */
    const int16_t input_frame,                                 /* i  : input frame length                    */
    const int16_t dtx_vad,                                     /* i  : DTX vad flag                          */
    const IVAS_FORMAT ivas_format                              /* i  : ivas format                           */
);                           
#endif
ivas_error ivas_dirac_config(
    void *st_ivas,                                              /* i/o: IVAS encoder/decoder state structure    */
+116 −3
Original line number Diff line number Diff line
@@ -542,6 +542,119 @@ void ivas_dirac_enc_spar_delay_synchro(

    return;
}
#else
/*-------------------------------------------------------------------------
 * ivas_dirac_enc()
 *
 * DirAC Encoder
 *
 *------------------------------------------------------------------------*/

void ivas_dirac_enc(
    DIRAC_ENC_HANDLE hDirAC,          /* i/o: encoder DirAC handle                  */
    IVAS_QMETADATA_HANDLE hQMetaData, /* i/o: q_metadata handle                     */
    BSTR_ENC_HANDLE hMetaData,        /* i/o: Metadata bitstream handle             */
    float data_f[][L_FRAME48k],       /* i/o: SBA channels                          */
    float **ppIn_FR_real,             /* o  : real freq domain values               */
    float **ppIn_FR_imag,             /* o  : imag freq domain values               */
    const int16_t input_frame,        /* i  : input frame length                    */
    const int16_t dtx_vad,            /* i  : DTX vad flag                          */
    const IVAS_FORMAT ivas_format )   /* i  : ivas format                           */
{
    int16_t orig_dirac_bands;
    float dir[3], avg_dir[3];
    float energySum, vecLen;
    int16_t i, j, b, i_ts;
    push_wmops( "ivas_dirac_enc" );

    ivas_dirac_param_est_enc( hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, ivas_format );


    if ( hQMetaData->q_direction->cfg.nbands > 0 )
    {
        orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands;

        if ( dtx_vad == 1 )
        {
            /* WB 4TC mode bit  : disable for now*/
            push_next_indice( hMetaData, 0, 1 );
            ivas_qmetadata_enc_encode( hMetaData, hQMetaData );
        }
        else
        {
            hQMetaData->q_direction[0].cfg.nbands = DIRAC_DTX_BANDS;

            /* compute directions */
            for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
            {
                set_zero( dir, 3 );
                set_zero( avg_dir, 3 );
                energySum = 0.0f;

                /* combine all DirAC bands except the last one, handle last band separately, last band covers BW above WB */
                for ( j = 0; j < orig_dirac_bands - 1; j++ )
                {
                    ivas_qmetadata_azimuth_elevation_to_direction_vector( hQMetaData->q_direction[0].band_data[j].azimuth[i], hQMetaData->q_direction[0].band_data[j].elevation[i], &dir[0] );
                    vecLen = hQMetaData->q_direction[0].band_data[j].energy_ratio[i] * hDirAC->buffer_energy[i * orig_dirac_bands + j];

                    avg_dir[0] += dir[0] * vecLen;
                    avg_dir[1] += dir[1] * vecLen;
                    avg_dir[2] += dir[2] * vecLen;

                    energySum += hDirAC->buffer_energy[i * orig_dirac_bands + j];
                }

                ivas_qmetadata_direction_vector_to_azimuth_elevation( &avg_dir[0], &hQMetaData->q_direction[0].band_data[0].azimuth[i], &hQMetaData->q_direction[0].band_data[0].elevation[i] );
                hQMetaData->q_direction[0].band_data[0].energy_ratio[i] = sqrtf( dotp( avg_dir, avg_dir, 3 ) ) / ( energySum + EPSILON );

                hQMetaData->q_direction[0].band_data[1].azimuth[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i];
                hQMetaData->q_direction[0].band_data[1].elevation[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i];
                hQMetaData->q_direction[0].band_data[1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i];
            }

            /* 1 bit to indicate mode MD coding : temp solution*/
            push_next_indice( hMetaData, 1, 1 );

            /* encode SID parameters */
            ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT );
        }

        for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ )
        {
            for ( i_ts = 0; i_ts < ( ( dtx_vad == 1 ) ? hQMetaData->q_direction[0].cfg.nblocks : 1 ); i_ts++ )
            {
                hQMetaData->q_direction->band_data[b].azimuth[i_ts] = hQMetaData->q_direction->band_data[b].q_azimuth[i_ts];
                hQMetaData->q_direction->band_data[b].elevation[i_ts] = hQMetaData->q_direction->band_data[b].q_elevation[i_ts];
                hQMetaData->q_direction[0].band_data[b].energy_ratio[0] = 1.0f - diffuseness_reconstructions[hQMetaData->q_direction[0].band_data[b].energy_ratio_index[0]];
            }
        }

        if ( dtx_vad == 0 )
        {
            for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
            {
                hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].azimuth[i] = hQMetaData->q_direction[0].band_data[1].azimuth[0];
                hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].elevation[i] = hQMetaData->q_direction[0].band_data[1].elevation[0];
                hQMetaData->q_direction[0].band_data[orig_dirac_bands - 1].energy_ratio[i] = hQMetaData->q_direction[0].band_data[1].energy_ratio[0];
            }

            for ( i = 0; i < MAX_PARAM_SPATIAL_SUBFRAMES; i++ )
            {
                for ( j = orig_dirac_bands - 2; j >= 0; j-- )
                {
                    hQMetaData->q_direction[0].band_data[j].azimuth[i] = hQMetaData->q_direction[0].band_data[0].azimuth[0];
                    hQMetaData->q_direction[0].band_data[j].elevation[i] = hQMetaData->q_direction[0].band_data[0].elevation[0];
                    hQMetaData->q_direction[0].band_data[j].energy_ratio[i] = hQMetaData->q_direction[0].band_data[0].energy_ratio[0];
                }
            }

            hQMetaData->q_direction->cfg.nbands = orig_dirac_bands;
        }
    }
    pop_wmops();

    return;
}
#endif

/*-------------------------------------------------------------------------
+9 −9
Original line number Diff line number Diff line
@@ -410,12 +410,17 @@ static ivas_error ivas_spar_enc_process(
    const int16_t *order;
    SPAR_ENC_HANDLE hSpar = st_ivas->hSpar;
    IVAS_QMETADATA_HANDLE hQMetaData = st_ivas->hQMetaData;
#ifndef SBA_MODE_CLEAN_UP
    int16_t ts, l_ts, orig_dirac_bands, num_del_samples;
#else
    int16_t ts, l_ts, num_del_samples;
#endif
    float *ppIn_FR_real[IVAS_SPAR_MAX_CH], *ppIn_FR_imag[IVAS_SPAR_MAX_CH];
    float w_del_buf[IVAS_FB_1MS_48K_SAMP];
#ifndef SBA_MODE_CLEAN_UP
    float dir[3], avg_dir[3];
    float energySum, vecLen;

#endif
    push_wmops( "ivas_spar_enc_process" );

    /*-----------------------------------------------------------------------------------------*
@@ -505,12 +510,8 @@ static ivas_error ivas_spar_enc_process(
     * DirAC encoding
     *-----------------------------------------------------------------------------------------*/
#ifndef SBA_MODE_CLEAN_UP
    ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, st_ivas->sba_mode );
#else
    ivas_dirac_param_est_enc( st_ivas->hDirAC, hQMetaData->q_direction, hQMetaData->useLowerRes, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, hEncoderConfig->ivas_format );

#endif

    if ( hQMetaData->q_direction->cfg.nbands > 0 )
    {
        orig_dirac_bands = hQMetaData->q_direction[0].cfg.nbands;
@@ -557,11 +558,7 @@ static ivas_error ivas_spar_enc_process(
            push_next_indice( hMetaData, 1, 1 );

            /* encode SID parameters */
#ifndef SBA_MODE_CLEAN_UP
            ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT, st_ivas->sba_mode );
#else
            ivas_qmetadata_enc_sid_encode( hMetaData, hQMetaData, -1, SBA_FORMAT );
#endif
        }

        for ( b = hQMetaData->q_direction->cfg.start_band; b < hQMetaData->q_direction->cfg.nbands; b++ )
@@ -596,6 +593,9 @@ static ivas_error ivas_spar_enc_process(
            hQMetaData->q_direction->cfg.nbands = orig_dirac_bands;
        }
    }
#else
    ivas_dirac_enc( st_ivas->hDirAC, hQMetaData, hMetaData, data_f, ppIn_FR_real, ppIn_FR_imag, input_frame, dtx_vad, hEncoderConfig->ivas_format );
#endif
    /*-----------------------------------------------------------------------------------------*
     * Set SPAR bitrates
     *-----------------------------------------------------------------------------------------*/