Commit f01f39a5 authored by Jouni Paulus's avatar Jouni Paulus
Browse files

add support for defining object modifications as relative to existing metadata.

modify the example combined_edit.txt so that obj0 gain, obj1 azimuth, and obj2 elevation edit are relative to existing parameter values.
parent 4e298ec0
Loading
Loading
Loading
Loading
Loading
+30 −3
Original line number Diff line number Diff line
@@ -32,6 +32,9 @@

#include "lib_dec.h"
#include <string.h>
#ifdef OBJECT_EDIT_FILE_INTERFACE
#include <math.h>
#endif
#include "cmdl_tools.h"
#include "audio_file_writer.h"
#include "bitstream_reader.h"
@@ -3735,22 +3738,46 @@ static void do_object_editing(
            {
                /* object direction editing only for diegetic objects */
                if ( readInfo->obj_azi_edited[obj_idx] )
                {
                    if ( readInfo->obj_azi_relative[obj_idx] )
                    {
                        /* azimuth: apply relative edit + wrap */
                        editableParameters->ism_metadata[obj_idx].azimuth = fmodf( editableParameters->ism_metadata[obj_idx].azimuth + readInfo->obj_azi[obj_idx] + 180.f, 360.f ) - 180.f;
                    }
                    else
                    {
                        editableParameters->ism_metadata[obj_idx].azimuth = readInfo->obj_azi[obj_idx];
                    }
                }
                if ( readInfo->obj_ele_edited[obj_idx] )
                {
                    if ( readInfo->obj_ele_relative[obj_idx] )
                    {
                        /* elevation: apply relative edit + saturation */
                        editableParameters->ism_metadata[obj_idx].elevation = fmaxf( fminf( editableParameters->ism_metadata[obj_idx].elevation + readInfo->obj_ele[obj_idx], 90.f ), -90.f );
                    }
                    else
                    {
                        editableParameters->ism_metadata[obj_idx].elevation = readInfo->obj_ele[obj_idx];
                    }
                }
            }

            /* gain editing for all objects */
            if ( readInfo->obj_gain_edited[obj_idx] )
            {
                if ( readInfo->obj_gain_relative[obj_idx] )
                {
                    /* gain: apply relative edit + saturation */
                    editableParameters->ism_metadata[obj_idx].gain = fmaxf( fminf( editableParameters->ism_metadata[obj_idx].gain * readInfo->obj_gain[obj_idx], OBJ_EDIT_GAIN_MAX ), OBJ_EDIT_GAIN_MIN );
                }
                else
                {
                    editableParameters->ism_metadata[obj_idx].gain = readInfo->obj_gain[obj_idx];
                }
            }
        }
    }
    else
    {
#endif
+39 −7
Original line number Diff line number Diff line
@@ -36,9 +36,6 @@ the United Nations Convention on Contracts on the International Sales of Goods.
#include "obj_edit_file_reader.h"
#include "prot.h"

#define OBJ_EDIT_GAIN_MIN 0.06309573f /* -24 dB */
#define OBJ_EDIT_GAIN_MAX 15.84893f   /* +24 dB */

/*-----------------------------------------------------------------------*
 * ObjectEditFileReader_open()
 *
@@ -79,10 +76,13 @@ ivas_error ObjectEditFileReader_open(
    {
        self->readInfo->obj_gain[obj_idx] = 0.0f;
        self->readInfo->obj_gain_edited[obj_idx] = false;
        self->readInfo->obj_gain_relative[obj_idx] = false;
        self->readInfo->obj_azi[obj_idx] = 0.0f;
        self->readInfo->obj_azi_edited[obj_idx] = false;
        self->readInfo->obj_azi_relative[obj_idx] = false;
        self->readInfo->obj_ele[obj_idx] = 0.0f;
        self->readInfo->obj_ele_edited[obj_idx] = false;
        self->readInfo->obj_ele_relative[obj_idx] = false;
    }

    self->rewound = false;
@@ -117,12 +117,15 @@ ivas_error ObjectEditFileReader_readNextFrame(
        for ( obj_idx = 0; obj_idx < IVAS_MAX_NUM_OBJECTS; obj_idx++ )
        {
            readEdits->obj_gain_edited[obj_idx] = false;
            readEdits->obj_gain_relative[obj_idx] = false;
            readEdits->obj_azi_edited[obj_idx] = false;
            readEdits->obj_azi_relative[obj_idx] = false;
            readEdits->obj_ele_edited[obj_idx] = false;
            readEdits->obj_ele_relative[obj_idx] = false;
        }

        /* tokenize the line by comma */
        /* {bg_gain=<float>}[,obj_<int>_<param>=<float>]*N, param in ('gain', 'azi', 'ele') */
        /* {bg_gain=<float>}[,obj_<int>_<param>=<float>]*N[,obj_<int>_<relparam>=<0|1>]*N, param in ('gain', 'azi', 'ele'), relparam in ('relgain', 'relazi', 'relele') */
        token = strtok( objEditReader->inLine, "," );
        while ( token != NULL )
        {
@@ -165,19 +168,31 @@ ivas_error ObjectEditFileReader_readNextFrame(
                        param = underscore_pos + 1;
                        if ( strcmp( param, "gain" ) == 0 )
                        {
                            readEdits->obj_gain[obj_idx] = max( min( strtof( paramValue, NULL ), OBJ_EDIT_GAIN_MAX ), OBJ_EDIT_GAIN_MIN );
                            readEdits->obj_gain[obj_idx] = strtof( paramValue, NULL );
                            readEdits->obj_gain_edited[obj_idx] = true;
                        }
                        else if ( strcmp( param, "azi" ) == 0 )
                        {
                            readEdits->obj_azi[obj_idx] = max( min( strtof( paramValue, NULL ), 180.f ), -180.f );
                            readEdits->obj_azi[obj_idx] = strtof( paramValue, NULL );
                            readEdits->obj_azi_edited[obj_idx] = true;
                        }
                        else if ( strcmp( param, "ele" ) == 0 )
                        {
                            readEdits->obj_ele[obj_idx] = max( min( strtof( paramValue, NULL ), 90.f ), -90.f );
                            readEdits->obj_ele[obj_idx] = strtof( paramValue, NULL );
                            readEdits->obj_ele_edited[obj_idx] = true;
                        }
                        else if ( strcmp( param, "relgain" ) == 0 )
                        {
                            readEdits->obj_gain_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0);
                        }
                        else if ( strcmp( param, "relazi" ) == 0 )
                        {
                            readEdits->obj_azi_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0 );
                        }
                        else if ( strcmp( param, "relele" ) == 0 )
                        {
                            readEdits->obj_ele_relative[obj_idx] = ( strcmp( paramValue, "1" ) == 0 );
                        }
                    }
                }
            }
@@ -185,6 +200,23 @@ ivas_error ObjectEditFileReader_readNextFrame(
            /* get the next token */
            token = strtok( NULL, "," );
        }

        /* sanitize values for absolute edits. relative edit sanitation done on result when applying the delta */
        for ( obj_idx = 0; obj_idx < IVAS_MAX_NUM_OBJECTS; obj_idx++ )
        {
            if ( readEdits->obj_gain_edited[obj_idx] && !readEdits->obj_gain_relative[obj_idx] )
            {
                readEdits->obj_gain[obj_idx] = max( min( readEdits->obj_gain[obj_idx], OBJ_EDIT_GAIN_MAX ), OBJ_EDIT_GAIN_MIN );
            }
            if ( readEdits->obj_azi_edited[obj_idx] && !readEdits->obj_azi_relative[obj_idx] )
            {
                readEdits->obj_azi[obj_idx] = max( min( readEdits->obj_azi[obj_idx], 180.f ), -180.f );
            }
            if ( readEdits->obj_ele_edited[obj_idx] && !readEdits->obj_ele_relative[obj_idx] )
            {
                readEdits->obj_ele[obj_idx] = max( min( readEdits->obj_ele[obj_idx], 90.f ), -90.f );
            }
        }
    }
    else
    {
+6 −0
Original line number Diff line number Diff line
@@ -36,6 +36,9 @@ the United Nations Convention on Contracts on the International Sales of Goods.
#include <stdbool.h>
#include "common_api_types.h"

#define OBJ_EDIT_GAIN_MIN 0.06309573f /* -24 dB */
#define OBJ_EDIT_GAIN_MAX 15.84893f   /* +24 dB */

typedef struct ObjectEditFileReader ObjectEditFileReader;
typedef struct ReadObjectEditInfo ReadObjectEditInfo;
struct ReadObjectEditInfo
@@ -45,12 +48,15 @@ struct ReadObjectEditInfo

    float obj_gain[IVAS_MAX_NUM_OBJECTS];
    bool obj_gain_edited[IVAS_MAX_NUM_OBJECTS];
    bool obj_gain_relative[IVAS_MAX_NUM_OBJECTS];

    float obj_azi[IVAS_MAX_NUM_OBJECTS];
    bool obj_azi_edited[IVAS_MAX_NUM_OBJECTS];
    bool obj_azi_relative[IVAS_MAX_NUM_OBJECTS];

    float obj_ele[IVAS_MAX_NUM_OBJECTS];
    bool obj_ele_edited[IVAS_MAX_NUM_OBJECTS];
    bool obj_ele_relative[IVAS_MAX_NUM_OBJECTS];
};

struct ObjectEditFileReader
+3 −0
Original line number Diff line number Diff line
@@ -635,8 +635,11 @@ of the following parameters separated by a comma:

bg_gain=<float>         linear gain to be applied on the SBA/MASA component in OSBA/OMASA, no effect for ISM
obj_<int>_gain=<float>  linear gain to be applied on object <int>, 0-based indexing
obj_<int>_relgain=0|1   if 1, obj_<int>_gain is interpreted as a relative modification. default is absolute modification
obj_<int>_azi=<float>   azimuth angle in degrees to be applied on object <int>, 0-based indexing
obj_<int>_relazi=0|1    if 1, obj_<int>_azi is interpreted as a relative modification. default is absolute modification
obj_<int>_ele=<float>   elevation angle in degrees to be applied on object <int>, 0-based indexing
obj_<int>_relele=0|1    if 1, obj_<int>_ele is interpreted as a relative modification. default is absolute modification

If a parameter is not specified, that parameter is not edited. An empty line in the file corresponds to
not editing any parameter in the item.
+15000 −15000

File changed.

Preview size limit exceeded, changes collapsed.