Commit becb7d7f authored by multrus's avatar multrus
Browse files

[cleanup] accept NONBE_1217_INIT_OBJ_EDIT

parent aa40cb98
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -172,7 +172,6 @@
/* any switch which is non-be wrt selection floating point code */
/* all switches in this category should start with "NONBE_" */

#define NONBE_1217_INIT_OBJ_EDIT                        /* VA: issue 1217: do object editing only when objects metadata is available */
#define NONBE_1217_OBJ_EDIT_FOA                         /* VA/Nokia: isse 1217: fix crash in object editing to FOA output in ParamISM */

#define NONBE_1230_DECODE_MASA_ISM_AZIMUTH_PREC_FROM_BASOP        /* Nokia: Fixes ivas_decode_masaism_metadata decision logic change due to precision difference; this is the fix in floating point */
+0 −321
Original line number Diff line number Diff line
@@ -1215,17 +1215,14 @@ ivas_error IVAS_DEC_GetEditableParameters(
)
{
    int16_t dirac_read_idx, obj;
#ifdef NONBE_1217_INIT_OBJ_EDIT
    Decoder_Struct *st_ivas;
    ISM_MODE ism_mode;
#endif

    if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasEditableParameters == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

#ifdef NONBE_1217_INIT_OBJ_EDIT
    st_ivas = hIvasDec->st_ivas;
    ism_mode = st_ivas->ism_mode;

@@ -1340,114 +1337,6 @@ ivas_error IVAS_DEC_GetEditableParameters(
        }
#endif
    }
#else
    if ( !( hIvasDec->st_ivas->ivas_format == ISM_FORMAT ||
            hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ||
            hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT ||
            ( hIvasDec->st_ivas->ivas_format == MASA_FORMAT && hIvasDec->st_ivas->nchan_ism > 0 ) ) )
    {
        return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED, "Object editing is not supported in this operation mode." );
    }

    if ( hIvasEditableParameters == NULL || hIvasDec == NULL || hIvasDec->st_ivas == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

    hIvasEditableParameters->gain_bed = 1.0f;
    hIvasEditableParameters->num_obj = hIvasDec->st_ivas->nchan_ism;
    if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT )
    {
        if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_DISC || hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC )
        {
            for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ )
            {
                hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth;
                hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hIsmMetaData[obj]->elevation;
                hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw;
                hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch;
                hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius;
                hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain;
                hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag;
            }

            if ( hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC )
            {
                hIvasEditableParameters->gain_bed = 1.0f;
            }
        }
        else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_PARAM )
        {
            for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ )
            {
                hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hParamIsmDec->azimuth_values[obj];
                hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hParamIsmDec->elevation_values[obj];
                hIvasEditableParameters->ism_metadata[obj].yaw = 0.0f;
                hIvasEditableParameters->ism_metadata[obj].pitch = 0.0f;
                hIvasEditableParameters->ism_metadata[obj].radius = 0.0f;
                hIvasEditableParameters->ism_metadata[obj].gain = 1.0f;
                hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = 0;
            }
        }
        else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_NONE )
        {
            hIvasEditableParameters->num_obj = 0;
        }
#ifdef DEBUGGING
        else
        {
            assert( 0 && "This should never happen!" );
        }
#endif
    }
    else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT && ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC ) )
    {
        /* object editing possible only in two highest OMASA modes */
        if ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC )
        {
            for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ )
            {
                hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth;
                hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hIsmMetaData[obj]->elevation;
                hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw;
                hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch;
                hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius;

                /* reset the otherwise unused "gain" field for the object */
                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = 1.0f;
                hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain;
                hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag;
            }
        }
        else
        {
            /* Handle MONO output */
            if ( hIvasDec->st_ivas->renderer_type != RENDERER_MONO_DOWNMIX )
            {
                dirac_read_idx = hIvasDec->st_ivas->hSpatParamRendCom->render_to_md_map[hIvasDec->st_ivas->hSpatParamRendCom->subframes_rendered];
            }
            else
            {
                dirac_read_idx = 0;
            }

            for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ )
            {
                hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hMasaIsmData->azimuth_ism[obj][dirac_read_idx];
                hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx];

                hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw;
                hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch;
                hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius;

                /* reset the otherwise unused "gain" field for the object */
                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = 1.0f;
                hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain;
                hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag;
            }
        }
    }
#endif

    return IVAS_ERR_OK;
}
@@ -1465,7 +1354,6 @@ ivas_error IVAS_DEC_SetEditableParameters(
)
{
    int16_t dirac_read_idx, obj;
#ifdef NONBE_1217_INIT_OBJ_EDIT
    Decoder_Struct *st_ivas;
    ISM_MODE ism_mode;

@@ -1696,215 +1584,6 @@ ivas_error IVAS_DEC_SetEditableParameters(
            st_ivas->hMasaIsmData->masa_gain_is_edited = 0u;
        }
    }
#else
    if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

    if ( !( hIvasDec->st_ivas->ivas_format == ISM_FORMAT ||
            hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ||
            hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT ||
            ( hIvasDec->st_ivas->ivas_format == MASA_FORMAT && hIvasDec->st_ivas->nchan_ism > 0 ) ) )
    {
        return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED, "Object editing no supported in this operation mode." );
    }

    if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL )
    {
        return IVAS_ERR_UNEXPECTED_NULL_POINTER;
    }

#ifdef DEBUGGING
    assert( hIvasEditableParameters.num_obj == hIvasDec->st_ivas->nchan_ism );
#endif

    if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT )
    {
        if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_DISC || hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC )
        {
            for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ )
            {
                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_azimuth = hIvasEditableParameters.ism_metadata[obj].azimuth;
                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_elevation = hIvasEditableParameters.ism_metadata[obj].elevation;
                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_radius = hIvasEditableParameters.ism_metadata[obj].radius;

                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain;

                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_yaw = hIvasEditableParameters.ism_metadata[obj].yaw;
                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_pitch = hIvasEditableParameters.ism_metadata[obj].pitch;

                hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag;
            }

            if ( hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC )
            {
                hIvasDec->st_ivas->hSbaIsmData->gain_bed = hIvasEditableParameters.gain_bed;
            }
        }
        else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_PARAM )
        {
            for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ )
            {
                hIvasDec->st_ivas->hParamIsmDec->edited_azimuth_values[obj] = hIvasEditableParameters.ism_metadata[obj].azimuth;
                hIvasDec->st_ivas->hParamIsmDec->edited_elevation_values[obj] = hIvasEditableParameters.ism_metadata[obj].elevation;
                hIvasDec->st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain;

                /* Detect direction editing in Param-ISM mode */
                if ( fabsf( hIvasDec->st_ivas->hParamIsmDec->azimuth_values[obj] - hIvasEditableParameters.ism_metadata[obj].azimuth ) > OMASA_AZI_EDIT_THR ||
                     fabsf( hIvasDec->st_ivas->hParamIsmDec->elevation_values[obj] - hIvasEditableParameters.ism_metadata[obj].elevation ) > OMASA_ELE_EDIT_THR )
                {
                    hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u;
                }
                else
                {
                    hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u;
                }

                /* Detect gain editing in Param-ISM mode */
                if ( fabsf( 1.0f - hIvasEditableParameters.ism_metadata[obj].gain ) > OMASA_GAIN_EDIT_THR )
                {
                    hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1u;
                }
                else
                {
                    hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 0u;
                }
            }

            /* MASA is not present with the ISM format */
            hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 0u;
        }
        else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_NONE )
        {
            if ( hIvasEditableParameters.num_obj != 0 )
            {
                return IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED;
            }
        }
        else
        {
            assert( 0 && "This should never happen!" );
        }
    }
    else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT && ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC ) )
    {
        int16_t id_th;
        float threshold_azi, threshold_ele;

        for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ )
        {
            if ( hIvasDec->st_ivas->hMasaIsmData != NULL )
            {
                /* copy relevant fields also to OMASA structs, but only if the value has been changed. original values are in st_ivas->hIsmMetaData */
                /* first, need to convert float values to ints used internally */
                int16_t new_azi, new_ele;
                if ( hIvasEditableParameters.ism_metadata[obj].azimuth > 0.0f )
                {
                    new_azi = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].azimuth + 0.5f );
                }
                else
                {
                    new_azi = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].azimuth - 0.5f );
                }

                if ( hIvasEditableParameters.ism_metadata[obj].elevation > 0.0f )
                {
                    new_ele = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].elevation + 0.5f );
                }
                else
                {
                    new_ele = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].elevation - 0.5f );
                }

                if ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ )
                {
                    /* Handle MONO output */
                    if ( hIvasDec->st_ivas->renderer_type != RENDERER_MONO_DOWNMIX )
                    {
                        dirac_read_idx = hIvasDec->st_ivas->hSpatParamRendCom->render_to_md_map[hIvasDec->st_ivas->hSpatParamRendCom->subframes_rendered];
                    }
                    else
                    {
                        dirac_read_idx = 0;
                    }

                    /* determine thresholds for detecting object metadata edit for direction based on quantization resolution of the spatial direction parameters.
                     * these depend from the number of bits used to transmit the directions,
                     * which in turn depends from the object priority and importance:
                     * importance -> priority -> number of bits -> elevation resolution -> elevation ring index -> azimuth resolution.
                     * leading to elevation_resolution -> elevation threshold and azimuth resolution -> azimuth threshold */
                    id_th = (int16_t) ( fabsf( (float) hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx] ) / delta_theta_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 3] + 0.5f );
                    threshold_azi = 360.0f / (float) no_phi_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 1][id_th];
                    threshold_ele = delta_theta_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 3];

                    if ( ( (float) abs( new_azi - hIvasDec->st_ivas->hMasaIsmData->azimuth_ism[obj][dirac_read_idx] ) > threshold_azi ) ||
                         ( (float) abs( new_ele - hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx] ) > threshold_ele ) )
                    {
                        /* at least one of the threshold is exceeded, so use new direction value and set editing detection flag */
                        hIvasDec->st_ivas->hMasaIsmData->azimuth_ism_edited[obj] = new_azi;
                        hIvasDec->st_ivas->hMasaIsmData->elevation_ism_edited[obj] = new_ele;

                        hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u;
                    }
                    else
                    {
                        hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u;
                    }
                }
                else
                {
                    /* detect editing in ISM_MASA_MODE_DISC. optionally, add quantization-resolution -based thresholds */
                    if ( fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth - hIvasEditableParameters.ism_metadata[obj].azimuth ) > OMASA_AZI_EDIT_THR ||
                         fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->elevation - hIvasEditableParameters.ism_metadata[obj].elevation ) > OMASA_ELE_EDIT_THR )
                    {
                        hIvasDec->st_ivas->hMasaIsmData->azimuth_ism_edited[obj] = new_azi;
                        hIvasDec->st_ivas->hMasaIsmData->elevation_ism_edited[obj] = new_ele;

                        hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u;
                    }
                    else
                    {
                        hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u;
                    }
                }

                /* compare pre-edit gain and the edited one to detect editing */
                if ( fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain - hIvasEditableParameters.ism_metadata[obj].gain ) > OMASA_GAIN_EDIT_THR )
                {
                    hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1u;
                    hIvasDec->st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain;
                }
                else
                {
                    hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 0u;
                }
            }

            /* Copy edited values to hIsmMetaData struct */
            if ( hIvasDec->st_ivas->hIsmMetaData[obj] != NULL )
            {
                hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth = hIvasEditableParameters.ism_metadata[obj].azimuth;
                hIvasDec->st_ivas->hIsmMetaData[obj]->elevation = hIvasEditableParameters.ism_metadata[obj].elevation;
                hIvasDec->st_ivas->hIsmMetaData[obj]->yaw = hIvasEditableParameters.ism_metadata[obj].yaw;
                hIvasDec->st_ivas->hIsmMetaData[obj]->pitch = hIvasEditableParameters.ism_metadata[obj].pitch;
                hIvasDec->st_ivas->hIsmMetaData[obj]->radius = hIvasEditableParameters.ism_metadata[obj].radius;
                hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain;
                hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag;
            }
        }

        if ( fabsf( hIvasEditableParameters.gain_bed - 1.0f ) > OMASA_GAIN_EDIT_THR )
        {
            hIvasDec->st_ivas->hMasaIsmData->gain_masa_edited = hIvasEditableParameters.gain_bed;
            hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 1u;
        }
        else
        {
            hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 0u;
        }
    }
#endif

    return IVAS_ERR_OK;
}