Commit 1d5d629e authored by vaclav's avatar vaclav
Browse files

introduce function ivas_omasa_ism_metadata_dec(0 in order to simplify ivas_dec.c()

parent 687ce1a0
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -5196,20 +5196,17 @@ void ivas_combined_format_brate_sanity(
    int16_t *diff_nBits                                         /* o  : number of differential bits             */
);


ISM_MODE ivas_omasa_ism_mode_select(
    const int32_t ivas_total_brate,                             /* i  : IVAS total bitrate                      */
    const int16_t nchan_ism                                     /* i  : number of input ISM's                   */
);

#ifdef MASA_AND_OBJECTS
void ivas_set_omasa_TC(
    const ISM_MODE ism_mode,                                    /* i  : ISM mode                                */
    const int16_t nchan_ism,                                    /* i  : number of input ISMs                    */
    int16_t *nSCE,                                              /* o  : number of SCEs                          */
    int16_t *nCPE                                               /* o  : number of CPEs                          */
);
#endif

void ivas_merge_masa_transports(
    float data_in_f1[][L_FRAME48k],                             /* i  : Transport audio signals 1               */
@@ -5219,15 +5216,22 @@ void ivas_merge_masa_transports(
    const int16_t num_transport_channels                        /* i  : Number of transport audio signals       */
);

ivas_error ivas_omasa_ism_metadata_dec(
    Decoder_Struct *st_ivas,                                    /* i/o: IVAS decoder structure                  */
    const int32_t ism_total_brate,                              /* i  : ISM total bitrate                       */
    int16_t *nchan_ism,                                         /* o  : number of ISM separated channels        */
    int16_t *nchan_transport_ism,                               /* o  : number of ISM TCs                       */
    const int16_t dirac_bs_md_write_idx,                        /* i  : DirAC bitstream write index             */
    int16_t nb_bits_metadata[]                                  /* o  : number of ISM metadata bits             */
);

ivas_error ivas_masa_ism_data_open(
    Decoder_Struct* st_ivas                                     /* i/o: IVAS decoder handle                     */
);

#ifdef MASA_AND_OBJECTS
void ivas_masa_ism_data_close(
    MASA_ISM_DATA_HANDLE *hMasaIsmData                          /* i/o: MASA_ISM rendering handle               */
);
#endif

void preProcessStereoTransportsForMovedObjects(
    Decoder_Struct* st_ivas,
+12 −66
Original line number Diff line number Diff line
@@ -404,23 +404,21 @@ ivas_error ivas_dec(
#ifdef MASA_AND_OBJECTS
    else if ( st_ivas->ivas_format == MASA_ISM_FORMAT )
    {
        int16_t dirac_bs_md_write_idx = 0;
        int16_t nchan_ism, nchan_transport_ism;
        int16_t dirac_bs_md_write_idx, dirac_read_idx;

        st = st_ivas->hCPE[0]->hCoreCoder[0];
        nb_bits_metadata[0] = 0;
        set_s( nb_bits_metadata, 0, MAX_SCE + 1 );

        /* Set the number of objects for the parametric rendering */
        dirac_bs_md_write_idx = 0;
        if ( st_ivas->hDirAC != NULL )
        {
            st_ivas->hDirAC->numIsmDirections = 0;
            if ( st_ivas->ism_mode != ISM_MASA_MODE_DISC && st_ivas->ism_mode != ISM_MASA_MODE_MASA_ONE_OBJ )
            {
                st_ivas->hDirAC->numIsmDirections = st_ivas->nchan_ism;
            }
            else
            {
                st_ivas->hDirAC->numIsmDirections = 0;
            }

            dirac_bs_md_write_idx = st_ivas->hDirAC->dirac_bs_md_write_idx; /* Store the write-index for this frame */
        }
@@ -436,66 +434,12 @@ ivas_error ivas_dec(

        st->bit_stream = &( st_ivas->bit_stream[( ism_total_brate / FRAMES_PER_SEC )] );

        //VE: !!!!!
        /* set ISM parameters */
        int16_t nchan_ism, nchan_transport_ism;
        nchan_ism = st_ivas->nchan_ism;
        nchan_transport_ism = st_ivas->nchan_ism;
        if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
        {
            nchan_ism = 1;
            nchan_transport_ism = 1;
        }
        else if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
        {
            nchan_ism = 0;
            nchan_transport_ism = 1;
        }

        /* decode ISM metadata */
        if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
        {
            int16_t azimuth_ism;
            int16_t elevation_ism;
            int16_t block;
            int16_t meta_write_index;

            /* decode ISM metadata */
            if ( ( error = ivas_ism_metadata_dec( ism_total_brate, nchan_ism, &nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi, &nb_bits_metadata[1], st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK )
        /* set ISM parameters and decode ISM metadata in OMASA format */
        if ( ( error = ivas_omasa_ism_metadata_dec( st_ivas, ism_total_brate, &nchan_ism, &nchan_transport_ism, dirac_bs_md_write_idx, &nb_bits_metadata[1] ) ) != IVAS_ERR_OK )
        {
            return error;
        }

            // VE: move the following updates into ivas_ism_metadata_dec()
            if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
            {
                for ( n = 0; n < st_ivas->nchan_ism; n++ )
                {
                    azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[n]->azimuth + 0.5f );
                    elevation_ism = (int16_t) ( st_ivas->hIsmMetaData[n]->elevation + 0.5f );

                    for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
                    {
                        meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hDirAC->dirac_md_buffer_length;
                        st_ivas->hMasaIsmData->azimuth_ism[n][meta_write_index] = azimuth_ism;
                        st_ivas->hMasaIsmData->elevation_ism[n][meta_write_index] = elevation_ism;
                    }
                }
            }
            else /* ISM_MASA_MODE_MASA_ONE_OBJ */
            {
                azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->azimuth + 0.5f );
                elevation_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->elevation + 0.5f );

                for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
                {
                    meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hDirAC->dirac_md_buffer_length;
                    st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = azimuth_ism;
                    st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = elevation_ism;
                }
            }
        }

        /* decode ISM channels */
        for ( n = 0; n < nchan_transport_ism; n++ )
        {
@@ -569,18 +513,20 @@ ivas_error ivas_dec(
        {
            if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_DISC )
            {
                //ivas_omasa_rend( st_ivas, output );


                float data_separated_objects[MAX_NUM_OBJECTS][L_FRAME48k];
                int16_t dirac_read_idx;

                if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
                {
                    mvr2r( output[2], data_separated_objects[0], output_frame );
                    //     mvr2r( output[2], data_separated_objects[0], output_frame );
                }
                else
                {
                    for ( n = 0; n < st_ivas->nchan_ism; n++ )
                    {
                        mvr2r( output[n + 2], data_separated_objects[n], output_frame );
                        //       mvr2r( output[n + 2], data_separated_objects[n], output_frame );
                    }
                }

+76 −0
Original line number Diff line number Diff line
@@ -392,4 +392,80 @@ void ivas_set_surplus_brate_dec(

    return;
}


/*--------------------------------------------------------------------------*
 * ivas_omasa_ism_metadata_dec()
 *
 * decode ISM metadata in OMASA format
 *--------------------------------------------------------------------------*/

ivas_error ivas_omasa_ism_metadata_dec(
    Decoder_Struct *st_ivas,             /* i/o: IVAS decoder structure            */
    const int32_t ism_total_brate,       /* i  : ISM total bitrate                 */
    int16_t *nchan_ism,                  /* o  : number of ISM separated channels  */
    int16_t *nchan_transport_ism,        /* o  : number of ISM TCs                 */
    const int16_t dirac_bs_md_write_idx, /* i  : DirAC bitstream write index       */
    int16_t nb_bits_metadata[]           /* o  : number of ISM metadata bits       */
)
{
    int16_t n, block;
    int16_t azimuth_ism, elevation_ism, meta_write_index;
    ivas_error error;

    /* set ISM parameters */
    *nchan_ism = st_ivas->nchan_ism;
    *nchan_transport_ism = st_ivas->nchan_ism;
    if ( st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
    {
        *nchan_ism = 1;
        *nchan_transport_ism = 1;
    }
    else if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
    {
        *nchan_ism = 0;
        *nchan_transport_ism = 1;
    }

    if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ )
    {
        /* decode ISM metadata */
        if ( ( error = ivas_ism_metadata_dec( ism_total_brate, *nchan_ism, nchan_transport_ism, st_ivas->hIsmMetaData, st_ivas->hSCE, st_ivas->bfi,
                                              nb_bits_metadata, st_ivas->ism_mode, st_ivas->hISMDTX, NULL, &st_ivas->ism_extmeta_active, &st_ivas->ism_extmeta_cnt ) ) != IVAS_ERR_OK )
        {
            return error;
        }

        if ( st_ivas->ism_mode == ISM_MASA_MODE_DISC )
        {
            for ( n = 0; n < st_ivas->nchan_ism; n++ )
            {
                azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[n]->azimuth + 0.5f );
                elevation_ism = (int16_t) ( st_ivas->hIsmMetaData[n]->elevation + 0.5f );

                for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
                {
                    meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hDirAC->dirac_md_buffer_length;
                    st_ivas->hMasaIsmData->azimuth_ism[n][meta_write_index] = azimuth_ism;
                    st_ivas->hMasaIsmData->elevation_ism[n][meta_write_index] = elevation_ism;
                }
            }
        }
        else /* ISM_MASA_MODE_MASA_ONE_OBJ */
        {
            azimuth_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->azimuth + 0.5f );
            elevation_ism = (int16_t) ( st_ivas->hIsmMetaData[0]->elevation + 0.5f );

            for ( block = 0; block < MAX_PARAM_SPATIAL_SUBFRAMES; block++ )
            {
                meta_write_index = ( dirac_bs_md_write_idx + block ) % st_ivas->hDirAC->dirac_md_buffer_length;
                st_ivas->hMasaIsmData->azimuth_separated_ism[meta_write_index] = azimuth_ism;
                st_ivas->hMasaIsmData->elevation_separated_ism[meta_write_index] = elevation_ism;
            }
        }
    }

    return IVAS_ERR_OK;
}

#endif
+6 −3
Original line number Diff line number Diff line
@@ -348,8 +348,11 @@ ivas_error ivas_enc(
        }

        /* Encode MASA parameters and write MASA metadata bitstream */
        ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, nb_bits_metadata, st_ivas->nchan_transport, ivas_format, ivas_total_brate, st_ivas->hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1,
                          st_ivas->ism_mode, hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, idx_separated_object, st_ivas->hOMasa, st_ivas->hIsmMetaData[0]->ism_imp );
        if ( ( error = ivas_masa_encode( st_ivas->hMasa, st_ivas->hQMetaData, hMetaData, nb_bits_metadata, st_ivas->nchan_transport, ivas_format, ivas_total_brate, st_ivas->hEncoderConfig->Opt_DTX_ON, st_ivas->nchan_transport == 2 ? st_ivas->hCPE[0]->element_mode : -1,
                                         st_ivas->ism_mode, hEncoderConfig->nchan_ism, st_ivas->hIsmMetaData, idx_separated_object, st_ivas->hOMasa, st_ivas->hIsmMetaData[0]->ism_imp ) ) != IVAS_ERR_OK )
        {
            return error;
        }

        /* Configuration of combined-format bit-budget distribution */
#ifdef DEBUG_MODE_INFO
@@ -368,7 +371,7 @@ ivas_error ivas_enc(
    else if ( ivas_format == MC_FORMAT )
    {
        /* select MC format mode; write MC LS setup; reconfigure the MC format encoder */
        if ( ( ivas_mc_enc_config( st_ivas ) ) != IVAS_ERR_OK )
        if ( ( error = ivas_mc_enc_config( st_ivas ) ) != IVAS_ERR_OK )
        {
            return error;
        }