Commit 7f07083d authored by wkr's avatar wkr
Browse files

fix object rendering to HOA at high BRs

parent 3a25dbd1
Loading
Loading
Loading
Loading
Loading
+9 −8
Original line number Diff line number Diff line
@@ -5561,6 +5561,7 @@ void ivas_osba_enc(
    const int16_t input_frame,                                  /* i  : Input frame size                          */
    const int16_t nchan_ism,                                    /* i  : Number of objects for parameter analysis  */
    const ISM_MODE ism_mode,                                    /* i  : ISM mode                                  */
    const int16_t sba_analysis_order,                           /* i  : SBA order evaluated in DirAC/SPAR encoder */
    float data_separated_object[L_FRAME48k],                    /* o  : Separated object audio signal             */
    int16_t *idx_separated_object                               /* o  : Index of the separated object             */
);
+1 −1
Original line number Diff line number Diff line
@@ -282,7 +282,7 @@ ivas_error ivas_enc(
        if ( st_ivas->ism_mode == ISM_MODE_NONE ) /*rendering of objects in SBA signal*/
        {
            /* Analyze objects and determine needed audio signals */
            ivas_osba_enc( st_ivas->hOSba, st_ivas->hIsmMetaData, data_f, input_frame, hEncoderConfig->nchan_ism, st_ivas->ism_mode, data_separated_object, &idx_separated_object );
            ivas_osba_enc( st_ivas->hOSba, st_ivas->hIsmMetaData, data_f, input_frame, hEncoderConfig->nchan_ism, st_ivas->ism_mode, st_ivas->sba_analysis_order, data_separated_object, &idx_separated_object );
        }
        else /*not an option for now*/
        {
+1 −2
Original line number Diff line number Diff line
@@ -220,8 +220,7 @@ int16_t getNumChanAnalysis(
#ifdef SBA_AND_OBJECTS
    else if ( st_ivas->hEncoderConfig->ivas_format == SBA_ISM_FORMAT )
    {
        // Todo OSBA merge: This might be wrong after addition of HO-DirAC. Decide if that is desired for combined format.
        n = st_ivas->hEncoderConfig->nchan_ism + FOA_CHANNELS;
        n = st_ivas->hEncoderConfig->nchan_ism + ( st_ivas->sba_analysis_order + 1 ) * ( st_ivas->sba_analysis_order + 1 );
    }
#endif
    return n;
+18 −12
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@

static void ivas_osba_energy_and_ratio_est( OSBA_ENC_HANDLE hOSba, float data_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_inp );

static void ivas_osba_render_ism_to_sba( float data_in_f[][L_FRAME48k], float data_out_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_sba, const int16_t nchan_ism, ISM_METADATA_HANDLE hIsmMeta[], float prev_gains[][FOA_CHANNELS], const float interpolator[L_FRAME48k] );
static void ivas_osba_render_ism_to_sba( float data_in_f[][L_FRAME48k], float data_out_f[][L_FRAME48k], const int16_t input_frame, const int16_t nchan_sba, const int16_t nchan_ism, ISM_METADATA_HANDLE hIsmMeta[], float prev_gains[][MAX_INPUT_CHANNELS], const float interpolator[L_FRAME48k] );

/*-------------------------------------------------------------------*
 * ivas_merge_sba_transports()
@@ -65,11 +65,13 @@ static void ivas_merge_sba_transports(
    float data_in_f2[][L_FRAME48k],
    float data_out_f[][L_FRAME48k],
    const int16_t input_frame,
    const int16_t num_transport_channels )
    const int16_t sba_analysis_order )
{
    int16_t i, j;
    int16_t i, j, nchan_sba;

    for ( i = 0; i < num_transport_channels; i++ )
    nchan_sba = (sba_analysis_order+1)*(sba_analysis_order+1);

    for ( i = 0; i < nchan_sba; i++ )
    {
        for ( j = 0; j < input_frame; j++ )
        {
@@ -105,7 +107,7 @@ ivas_error ivas_osba_enc_open(

    for ( i = 0; i < MAX_NUM_OBJECTS; i++ )
    {
        set_f( hOSba->prev_object_dm_gains[i], (float) sqrt( 0.5 ), FOA_CHANNELS );
        set_f( hOSba->prev_object_dm_gains[i], (float) sqrt( 0.5 ), MAX_INPUT_CHANNELS );
    }
    set_zero( hOSba->broadband_energy_sm, MAX_NUM_OBJECTS + FOA_CHANNELS );
    set_zero( hOSba->broadband_energy_prev, MAX_NUM_OBJECTS + FOA_CHANNELS );
@@ -192,19 +194,20 @@ void ivas_osba_enc(
    const int16_t input_frame,               /* i  : Input frame size                            */
    const int16_t nchan_ism,                 /* i  : Number of objects for parameter analysis    */
    const ISM_MODE ism_mode,                 /* i  : ISM mode                                    */
    const int16_t sba_analysis_order,        /* i  : SBA order evaluated in DirAC/SPAR encoder */
    float data_separated_object[L_FRAME48k], /* o  : Separated object audio signal               */
    int16_t *idx_separated_object            /* o  : Index of the separated object               */
)
{
    float data_out_f[FOA_CHANNELS][L_FRAME48k];
    float data_out_f[MAX_INPUT_CHANNELS][L_FRAME48k];

    if ( ism_mode == ISM_MODE_NONE )
    {
        /* Convert ISM to SBA */
        ivas_osba_render_ism_to_sba( data_in_f, data_out_f, input_frame, FOA_CHANNELS, nchan_ism, hIsmMeta, hOSba->prev_object_dm_gains, hOSba->interpolator );
        ivas_osba_render_ism_to_sba( data_in_f, data_out_f, input_frame, sba_analysis_order, nchan_ism, hIsmMeta, hOSba->prev_object_dm_gains, hOSba->interpolator );

        /* Merge SBA signals */
        ivas_merge_sba_transports( data_out_f, &( data_in_f[nchan_ism] ), data_in_f, input_frame, FOA_CHANNELS );
        ivas_merge_sba_transports( data_out_f, &( data_in_f[nchan_ism] ), data_in_f, input_frame, sba_analysis_order );
    }
    /* Set the number of objects */
    hOSba->nchan_ism = nchan_ism;
@@ -317,18 +320,21 @@ static void ivas_osba_render_ism_to_sba(
    float data_in_f[][L_FRAME48k],
    float data_out_f[][L_FRAME48k],
    const int16_t input_frame,
    const int16_t nchan_sba,
    const int16_t sba_analysis_order,
    const int16_t nchan_ism,
    ISM_METADATA_HANDLE hIsmMeta[],
    float prev_gains[][FOA_CHANNELS],
    float prev_gains[][MAX_INPUT_CHANNELS],
    const float interpolator[L_FRAME48k] )
{
    int16_t i, j, k;
    int16_t azimuth, elevation;
    float gains[FOA_CHANNELS];
    float gains[MAX_INPUT_CHANNELS];
    float g1, g2;
    float output_gain;

    int16_t nchan_sba;

    nchan_sba = (sba_analysis_order+1)*(sba_analysis_order+1);

    for ( i = 0; i < nchan_sba; i++ )
    {
@@ -340,7 +346,7 @@ static void ivas_osba_render_ism_to_sba(
        azimuth = (int16_t) floorf( hIsmMeta[i]->azimuth + 0.5f );
        elevation = (int16_t) floorf( hIsmMeta[i]->elevation + 0.5f );

        ivas_dirac_dec_get_response( azimuth, elevation, gains, 1 );
        ivas_dirac_dec_get_response( azimuth, elevation, gains, sba_analysis_order );

        /* Render using the sh gains */
        for ( j = 0; j < nchan_sba; j++ )
+1 −1
Original line number Diff line number Diff line
@@ -887,7 +887,7 @@ typedef struct ivas_osba_enc_data_structure

    float interpolator[L_FRAME48k];

    float prev_object_dm_gains[MAX_NUM_OBJECTS][FOA_CHANNELS];
    float prev_object_dm_gains[MAX_NUM_OBJECTS][MAX_INPUT_CHANNELS];
    float broadband_energy_sm[MAX_NUM_OBJECTS + FOA_CHANNELS];
    float broadband_energy_prev[MAX_NUM_OBJECTS + FOA_CHANNELS];
    int16_t prev_selected_object;