Commit 979318d7 authored by vaclav's avatar vaclav
Browse files

add OBJ_EDITING_EXAMPLE to VoIP path

parent d46c3e3b
Loading
Loading
Loading
Loading
+90 −59
Original line number Diff line number Diff line
@@ -171,6 +171,10 @@ static ivas_error printBitstreamInfoVoip( DecArguments arg, BS_READER_HANDLE hBs
static int16_t app_own_random( int16_t *seed );
static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec( char *forcedRendModeChar );
#endif
#ifdef OBJ_EDITING_EXAMPLE
static ivas_error do_object_editing( IVAS_DEC_HANDLE hIvasDec );
#endif


/*------------------------------------------------------------------------------------------*
 * main()
@@ -2459,76 +2463,25 @@ static ivas_error decodeG192(
                }

#ifdef OBJ_EDITING_API
#ifdef OBJ_EDITING_EXAMPLE
                /* Do object info editing */
                if ( arg.objEditEnabled )
                {
                    IVAS_EDITABLE_PARAMETERS editableParameters;

                    /* get object parameters */
                    if ( ( error = IVAS_DEC_GetEditableParameters( hIvasDec, &editableParameters ) ) != IVAS_ERR_OK )
                    {
                        fprintf( stderr, "\nError: could not get the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
                        goto cleanup;
                    }

                    /* edit object parameters...*/

                    /* put the objects equally spaced at the horizontal plane */
                    /* and play a little bit with the gains... */
                    int16_t obj_idx, non_diegetic_obj_idx;
                    int16_t num_nondiegetic_objects;

                    num_nondiegetic_objects = 0;
                    for ( obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ )
                    {
                        if ( !editableParameters.ism_metadata[obj_idx].non_diegetic_flag )
                        {
                            num_nondiegetic_objects++;
                        }
                    }

                    if ( num_nondiegetic_objects )
                    {
                        float start_angle, angle_inc;
                        angle_inc = 360.0f / (float) num_nondiegetic_objects;
                        start_angle = angle_inc / 2.0f;
                        for ( obj_idx = 0, non_diegetic_obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ )
                        {
                            if ( !editableParameters.ism_metadata[obj_idx].non_diegetic_flag )
                            {
                                editableParameters.ism_metadata[obj_idx].elevation = 0.0f;
                                editableParameters.ism_metadata[obj_idx].azimuth = start_angle + (float) non_diegetic_obj_idx * angle_inc;
                                non_diegetic_obj_idx++;
                            }
                        }
                    }

                    /* breakover object gains */
                    for ( obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ )
                    {
                        editableParameters.ism_metadata[obj_idx].gain = 0.5f + (float) ( ( frame + obj_idx * 50 ) % 250 ) / 250.0f;
                    }

                    editableParameters.gain_bed = 0.5f;

                    /* set new object parameters */
                    if ( ( error = IVAS_DEC_SetEditableParameters( hIvasDec, editableParameters ) ) != IVAS_ERR_OK )
                    /* Do object metadata editing here */
#ifdef OBJ_EDITING_EXAMPLE
                    if ( ( error = do_object_editing( hIvasDec ) ) != IVAS_ERR_OK )
                    {
                        fprintf( stderr, "\nError: could not set the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
                        goto cleanup;
                    }
#endif
                }

#endif
                /* Do the final preparations needed for rendering */
                if ( ( error = IVAS_DEC_PrepareRenderer( hIvasDec ) ) != IVAS_ERR_OK )
                {
                    fprintf( stderr, "\nError: could not prepare the renderer: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
                    goto cleanup;
                }
#endif
            }
#endif

            if ( isSplitRend )
            {
@@ -3388,7 +3341,12 @@ static ivas_error decodeVoIP(
#ifdef OBJ_EDITING_API
            if ( parameterAvailableForEditing == true ) // VE: harmonize it with decodeG192()
            {
                /* do the object editing here */
#ifdef OBJ_EDITING_EXAMPLE
                if ( ( error = do_object_editing( hIvasDec ) ) != IVAS_ERR_OK )
                {
                    goto cleanup;
                }
#endif
            }
        } /* while ( nSamplesRendered < nOutSamples ) */
#endif
@@ -3674,6 +3632,78 @@ cleanup:
    return error;
}

#ifdef OBJ_EDITING_EXAMPLE

/*---------------------------------------------------------------------*
 * do_object_editing()
 *
 * Example function of how to edit objects metadata
 *---------------------------------------------------------------------*/

static ivas_error do_object_editing(
    IVAS_DEC_HANDLE hIvasDec )
{
    IVAS_EDITABLE_PARAMETERS editableParameters;
    ivas_error error;

    /* get object parameters */
    if ( ( error = IVAS_DEC_GetEditableParameters( hIvasDec, &editableParameters ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nError: could not get the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
        return error;
    }

    /* edit object parameters...*/

    /* put the objects equally spaced at the horizontal plane */
    /* and play a little bit with the gains... */
    int16_t obj_idx, non_diegetic_obj_idx;
    int16_t num_nondiegetic_objects;

    num_nondiegetic_objects = 0;
    for ( obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ )
    {
        if ( !editableParameters.ism_metadata[obj_idx].non_diegetic_flag )
        {
            num_nondiegetic_objects++;
        }
    }

    if ( num_nondiegetic_objects )
    {
        float start_angle, angle_inc;
        angle_inc = 360.0f / (float) num_nondiegetic_objects;
        start_angle = angle_inc / 2.0f;
        for ( obj_idx = 0, non_diegetic_obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ )
        {
            if ( !editableParameters.ism_metadata[obj_idx].non_diegetic_flag )
            {
                editableParameters.ism_metadata[obj_idx].elevation = 0.0f;
                editableParameters.ism_metadata[obj_idx].azimuth = start_angle + (float) non_diegetic_obj_idx * angle_inc;
                non_diegetic_obj_idx++;
            }
        }
    }

    /* breakover object gains */
    for ( obj_idx = 0; obj_idx < editableParameters.num_obj; obj_idx++ )
    {
        editableParameters.ism_metadata[obj_idx].gain = 0.5f + (float) ( ( frame + obj_idx * 50 ) % 250 ) / 250.0f;
    }

    editableParameters.gain_bed = 0.5f;

    /* set new object parameters */
    if ( ( error = IVAS_DEC_SetEditableParameters( hIvasDec, editableParameters ) ) != IVAS_ERR_OK )
    {
        fprintf( stderr, "\nError: could not set the editable parameters: %s\n\n", IVAS_DEC_GetErrorMessage( error ) );
        return error;
    }

    return IVAS_ERR_OK;
}

#endif

#ifdef DEBUGGING

@@ -3699,4 +3729,5 @@ static IVAS_DEC_FORCED_REND_MODE parseForcedRendModeDec(
}
#endif


#undef WMC_TOOL_SKIP