Commit a9c4d9db authored by Marek Szczerba's avatar Marek Szczerba
Browse files

Merge branch...

Merge branch 'philips/contribution-38-control-metadata-reverb_combine-render-reverb-configurations' into 'philips/contribution-38-control-metadata-reverb'

Render configuration file referring to the binary reverb configuration

See merge request !592
parents 5c40aeeb a0678aca
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -506,7 +506,7 @@ int main(
        }

#ifdef CONTROL_METADATA_REVERB
        if ( RenderConfigReader_read( renderConfigReader ) != IVAS_ERR_OK )
        if ( RenderConfigReader_read( renderConfigReader, arg.renderConfigFilename, &renderConfig ) != IVAS_ERR_OK )
#else
        if ( RenderConfigReader_read( renderConfigReader, &renderConfig ) != IVAS_ERR_OK )
#endif
@@ -516,7 +516,15 @@ int main(
        }

#ifdef CONTROL_METADATA_REVERB
        if ( RenderConfigReader_getAcousticEnvironment( renderConfigReader, ACOUSTIC_ENVIRONMENT_ID, &renderConfig.room_acoustics ) != IVAS_ERR_OK )
        if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, ACOUSTIC_ENVIRONMENT_ID, &renderConfig.room_acoustics ) ) == IVAS_ERR_OK )
        {
            if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "Invalid reverberation configuration parameters\n\n" );
                goto cleanup;
            }
        }
        else if ( error != IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING )
        {
            fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", ACOUSTIC_ENVIRONMENT_ID );
            goto cleanup;
+10 −2
Original line number Diff line number Diff line
@@ -732,7 +732,7 @@ int main(
        }

#ifdef CONTROL_METADATA_REVERB
        if ( RenderConfigReader_read( renderConfigReader ) != IVAS_ERR_OK )
        if ( RenderConfigReader_read( renderConfigReader, args.renderConfigFilePath, &renderConfig ) != IVAS_ERR_OK )
#else
        if ( RenderConfigReader_read( renderConfigReader, &renderConfig ) != IVAS_ERR_OK )
#endif
@@ -742,7 +742,15 @@ int main(
        }

#ifdef CONTROL_METADATA_REVERB
        if ( RenderConfigReader_getAcousticEnvironment( renderConfigReader, ACOUSTIC_ENVIRONMENT_ID, &renderConfig.room_acoustics ) != IVAS_ERR_OK )
        if ( ( error = RenderConfigReader_getAcousticEnvironment( renderConfigReader, ACOUSTIC_ENVIRONMENT_ID, &renderConfig.room_acoustics ) ) == IVAS_ERR_OK )
        {
            if ( RenderConfigReader_checkValues( &renderConfig ) != IVAS_ERR_OK )
            {
                fprintf( stderr, "Invalid reverberation configuration parameters\n\n" );
                exit( -1 );
            }
        }
        else if ( error != IVAS_ERR_ACOUSTIC_ENVIRONMENT_MISSING )
        {
            fprintf( stderr, "Failed to get acoustic environment with ID: %d\n\n", ACOUSTIC_ENVIRONMENT_ID );
            exit( -1 );
+98 −38
Original line number Diff line number Diff line
@@ -35,10 +35,9 @@
#include "prot.h"
#ifdef CONTROL_METADATA_REVERB
#include <math.h>
#else
#endif
#include <ctype.h>
#include "cmdl_tools.h"
#endif

/*------------------------------------------------------------------------------------------*
 * PreProc Macros
@@ -46,7 +45,9 @@

#ifndef CONTROL_METADATA_REVERB
#define MAX_LINE_LENGTH ( 1024 )
#endif
#define MAX_ITEM_LENGTH ( 64 )
#ifndef CONTROL_METADATA_REVERB
#define N_REVERB_VECTORS ( 3 )
#endif

@@ -702,6 +703,7 @@ static int16_t read_bool(

    return true;
}
#endif

/*-----------------------------------------------------------------------------------------*
 * Function read_vector()
@@ -823,7 +825,11 @@ static int32_t errorHandler(
 * Verifies if the configuration parameters lie within acceptable limits
 *------------------------------------------------------------------------------------------*/

#ifdef CONTROL_METADATA_REVERB
ivas_error RenderConfigReader_checkValues(
#else
static ivas_error RenderConfigReader_checkValues(
#endif
    IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* o  : Renderer configuration handle          */
)
{
@@ -908,7 +914,6 @@ static ivas_error RenderConfigReader_checkValues(

    return IVAS_ERR_OK;
}
#endif

/*------------------------------------------------------------------------------------------*
 * RenderConfigReader_open()
@@ -923,9 +928,6 @@ ivas_error RenderConfigReader_open(
{
    RenderConfigReader *pSelf;
    FILE *pConfigFile;
#ifndef CONTROL_METADATA_REVERB
    int length;
#endif

    /* Open the configuration file  */
    if ( strlen( pConfigPath ) < 1 )
@@ -933,17 +935,7 @@ ivas_error RenderConfigReader_open(
        return IVAS_ERR_FAILED_FILE_OPEN;
    }

#ifdef CONTROL_METADATA_REVERB
    pConfigFile = fopen( pConfigPath, "rb" );
#else
    /* use corresponding .cfg file */
    length = strlen( pConfigPath );
    if ( length >= 4 && strcmp( &pConfigPath[length - 4], ".dat" ) == 0 )
    {
        strcpy( &pConfigPath[length - 4], ".cfg" );
    }
    pConfigFile = fopen( pConfigPath, "r" );
#endif

    if ( !pConfigFile )
    {
@@ -959,13 +951,14 @@ ivas_error RenderConfigReader_open(


/*------------------------------------------------------------------------------------------*
 * RenderConfigReader_read()
 * RenderConfigReader_readReverb()
 *
 * Reads the configuration from a file
 * Reads the binary reverb configuration from a file
 *------------------------------------------------------------------------------------------*/

#ifdef CONTROL_METADATA_REVERB
ivas_error RenderConfigReader_read(
static ivas_error RenderConfigReader_readReverb(
    const char *pReverbConfigPath,          /* i   : Reverb configuration file path        */
    RenderConfigReader *pRenderConfigReader /* i/o : RenderConfigReader handle             */
)
{
@@ -977,11 +970,20 @@ ivas_error RenderConfigReader_read(
    uint32_t gridLen;
    uint32_t subGridLen;
    const float *pGrid;
    FILE *pReverbConfigFile;

    /* Open the configuration file  */
    pReverbConfigFile = fopen( pReverbConfigPath, "rb" );

    if ( !pReverbConfigFile )
    {
        return IVAS_ERR_FAILED_FILE_OPEN;
    }

    /* Read the bitstream */
    fseek( pRenderConfigReader->pConfigFile, 0, SEEK_END );
    file_size = ftell( pRenderConfigReader->pConfigFile );
    rewind( pRenderConfigReader->pConfigFile );
    fseek( pReverbConfigFile, 0, SEEK_END );
    file_size = ftell( pReverbConfigFile );
    rewind( pReverbConfigFile );

    pRenderConfigReader->pBitstream = (uint8_t *) malloc( file_size * sizeof( uint8_t ) );
    if ( pRenderConfigReader->pBitstream == NULL )
@@ -989,7 +991,7 @@ ivas_error RenderConfigReader_read(
        return IVAS_ERR_FAILED_ALLOC;
    }

    fread( pRenderConfigReader->pBitstream, sizeof( uint8_t ), file_size, pRenderConfigReader->pConfigFile );
    fread( pRenderConfigReader->pBitstream, sizeof( uint8_t ), file_size, pReverbConfigFile );
    pRenderConfigReader->length = file_size;

    /****************************/
@@ -1250,10 +1252,17 @@ ivas_error RenderConfigReader_read(
    return IVAS_ERR_OK;
}

#else
#endif

ivas_error RenderConfigReader_read(
    RenderConfigReader *pRenderConfigReader, /* i/o : RenderConfigReader handle           */
#ifdef CONTROL_METADATA_REVERB
    RenderConfigReader *pRenderConfigReader, /* i  : RenderConfigReader handle              */
    const char *pRenderConfigPath,           /* i  : Renderer configuration file path       */
    IVAS_RENDER_CONFIG_HANDLE hRenderConfig  /* o  : Renderer configuration handle          */
#else
    RenderConfigReader *pRenderConfigReader, /* i  : RenderConfigReader handle              */
    IVAS_RENDER_CONFIG_HANDLE hRenderConfig  /* o  : Renderer configuration handle          */
#endif
)
{
    int32_t file_size;
@@ -1265,8 +1274,14 @@ ivas_error RenderConfigReader_read(
    char item[MAX_ITEM_LENGTH + 1];
    char chapter[MAX_ITEM_LENGTH + 1];
    char *pValue;
#ifdef CONTROL_METADATA_REVERB
    ivas_error error;
    int32_t params_length;
    int32_t length;
#else
    int16_t nBandsInput;
    int16_t nVectorsMissing;
#endif

    fseek( pRenderConfigReader->pConfigFile, 0, SEEK_END );
    file_size = ftell( pRenderConfigReader->pConfigFile );
@@ -1274,8 +1289,10 @@ ivas_error RenderConfigReader_read(
    pConfig_str = (char *) calloc( file_size + 1, sizeof( char ) );
    pParams = (char *) calloc( file_size + 1, sizeof( char ) );
    pTemp = (char *) calloc( file_size + 1, sizeof( char ) );
#ifndef CONTROL_METADATA_REVERB
    nBandsInput = hRenderConfig->room_acoustics.nBands;
    nVectorsMissing = N_REVERB_VECTORS;
#endif

    /* read file line by line */
    while ( fgets( pConfig_str, file_size, pRenderConfigReader->pConfigFile ) != NULL )
@@ -1308,6 +1325,7 @@ ivas_error RenderConfigReader_read(
            to_upper( chapter );

            /* interpret params */
#ifndef CONTROL_METADATA_REVERB
            if ( strcmp( chapter, "ROOMACOUSTICS" ) == 0 )
            {
                params_idx = 0;
@@ -1395,15 +1413,51 @@ ivas_error RenderConfigReader_read(
                    fprintf( stderr, "Reverb config: number of bands changed but configuration vectors missing\n" );
                }
            }
#ifdef DEBUGGING
            else if ( strcmp( chapter, "GENERAL" ) == 0 && strlen( pParams ) != 0 )
#else
            if ( strcmp( chapter, "GENERAL" ) == 0 && strlen( pParams ) != 0 )
#endif
            {
                params_idx = 0;
                pValue = (char *) calloc( strlen( pParams ), sizeof( char ) );
                while ( sscanf( pParams + params_idx, "%64[^=]=%[^;];", item, pValue ) == 2 )
                {
#ifdef CONTROL_METADATA_REVERB
                    params_length = (int32_t) ( strlen( item ) + strlen( pValue ) + 2 );
#else
                    params_idx += (int32_t) ( strlen( item ) + strlen( pValue ) + 2 );
#endif
#ifdef DEBUGGING
                    fprintf( stderr, "        PARAM: %s -> %s\n", item, pValue );
#endif
#ifdef CONTROL_METADATA_REVERB
                    if ( strcmp( item, "REVERBFILE" ) == 0 )
                    {
                        /* get correct case reverb configuration file path */
                        sscanf( pTemp + params_idx, "%*[^=] = %[^;];", pValue );

                        /* make reverb configuration file path relative to render configuration file path */
                        for ( length = (int32_t) strlen( pRenderConfigPath ) - 1; length >= 0; length-- )
                        {
                            if ( pRenderConfigPath[length] == '\\' || pRenderConfigPath[length] == '/' )
                            {
                                length++;
                                break;
                            }
                        }
                        char *pCombinedName = calloc( length + (int32_t) strlen( pValue ) + 1, sizeof( char ) );
                        strncpy( pCombinedName, pRenderConfigPath, length );
                        strcpy( pCombinedName + length, pValue );

                        if ( ( error = RenderConfigReader_readReverb( pCombinedName, pRenderConfigReader ) ) != IVAS_ERR_OK )
                        {
                            errorHandler( item, ERROR_VALUE_INVALID );
                        }
                        free( pCombinedName );
                    }
                    else
#endif
#ifdef DEBUGGING
                        if ( strcmp( item, "RENDERER" ) == 0 )
                    {
                        if ( strcmp( pValue, "CREND" ) == 0 )
@@ -1431,11 +1485,14 @@ ivas_error RenderConfigReader_read(
                    {
                        fprintf( stderr, "Unsupported configuration property %s\n", item );
                    }
#endif
#endif
#ifdef CONTROL_METADATA_REVERB
                    params_idx += params_length;
#endif
                }
                free( pValue );
            }
#endif
            else
            {
                fprintf( stderr, "Unknown chapter: %s\n", chapter );
@@ -1462,9 +1519,12 @@ ivas_error RenderConfigReader_read(
        fprintf( stderr, "Errors occurred\n" );
        return IVAS_ERR_FAILED_FILE_PARSE;
    }
#ifdef CONTROL_METADATA_REVERB
    return IVAS_ERR_OK;
#else
    return RenderConfigReader_checkValues( hRenderConfig );
}
#endif
}

#ifdef CONTROL_METADATA_REVERB
/*------------------------------------------------------------------------------------------*
+12 −7
Original line number Diff line number Diff line
@@ -51,25 +51,30 @@ ivas_error RenderConfigReader_open(
    RenderConfigReader **ppRenderConfigReader /* o  : RenderConfigReader handle             */
);

/* Reads a configuration                                                                    */
#ifdef CONTROL_METADATA_REVERB
ivas_error RenderConfigReader_read(
    RenderConfigReader *pRenderConfigReader  /* i  : RenderConfigReader handle              */
);

/* Get an acoustic environment                                                              */
ivas_error RenderConfigReader_getAcousticEnvironment(
    RenderConfigReader *pRenderConfigReader, /* i  : RenderConfigReader handle              */
    uint16_t id,                             /* i  : Acoustic environment ID                */
    IVAS_ROOM_ACOUSTICS_CONFIG_DATA *pAcEnv  /* o  : Target acoustic environment pointer    */
);
/* Verifies configuration parameters                                                        */
ivas_error RenderConfigReader_checkValues(
    IVAS_RENDER_CONFIG_HANDLE hRenderConfig /* o  : Renderer configuration handle           */
);
#endif

#else
/* Reads a configuration                                                                    */
ivas_error RenderConfigReader_read(
#ifdef CONTROL_METADATA_REVERB
    RenderConfigReader *pRenderConfigReader, /* i  : RenderConfigReader handle              */
    const char *pRenderConfigPath,           /* i  : Renderer configuration file path       */
    IVAS_RENDER_CONFIG_HANDLE hRenderConfig  /* o  : Renderer configuration handle          */
#else
    RenderConfigReader *pRenderConfigReader, /* i  : RenderConfigReader handle              */
    IVAS_RENDER_CONFIG_HANDLE hRenderConfig  /* o  : Renderer configuration handle          */
);
#endif
);

/* Closes the renderer configuration reader and deallocates memory                          */
void RenderConfigReader_close(
+8 −8
Original line number Diff line number Diff line
@@ -918,35 +918,35 @@

// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_REVERB out Config renderer
../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit
../IVAS_dec -render_config testv/rend_config_renderer.dat BINAURAL_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst
../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_renderer.tst

// Multi-channel 5_1 at 512 kbps, 48kHz in, 32kHz out, BINAURAL_REVERB out Config renderer
../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit
../IVAS_dec -render_config testv/rend_config_renderer.dat BINAURAL_REVERB 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst
../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_REVERB 32 bit testv/stv51MC48c.wav_MC51_512000_48-32_MC_Config_renderer.tst

// Multi-channel 5_1 at 512 kbps, 48kHz in, 16kHz out, BINAURAL_REVERB out Config renderer
../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit
../IVAS_dec -render_config testv/rend_config_renderer.dat BINAURAL_REVERB 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst
../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_REVERB 16 bit testv/stv51MC48c.wav_MC51_512000_48-16_MC_Config_renderer.tst

// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_REVERB out Config hospital_patientroom
../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit
../IVAS_dec -render_config testv/rend_config_hospital_patientroom.dat BINAURAL_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst
../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_hospital_patientroom.tst

// Multi-channel 5_1 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_REVERB out Config recreation
../IVAS_cod -mc 5_1 512000 48 testv/stv51MC48c.wav bit
../IVAS_dec -render_config testv/rend_config_recreation.dat BINAURAL_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst
../IVAS_dec -render_config testv/rend_config_recreation.cfg BINAURAL_REVERB 48 bit testv/stv51MC48c.wav_MC51_512000_48-48_MC_Config_recreation.tst

// Multi-channel 5_1_2 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_REVERB out Config renderer
../IVAS_cod -mc 5_1_2 512000 48 testv/stv512MC48c.wav bit
../IVAS_dec -render_config testv/rend_config_renderer.dat BINAURAL_REVERB 48 bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst
../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_REVERB 48 bit testv/stv512MC48c.wav_MC512_512000_48-48_MC_Config_renderer.tst

// Multi-channel 5_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_REVERB out Config renderer
../IVAS_cod -mc 5_1_4 512000 48 testv/stv514MC48c.wav bit
../IVAS_dec -render_config testv/rend_config_renderer.dat BINAURAL_REVERB 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst
../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_REVERB 48 bit testv/stv514MC48c.wav_MC514_512000_48-48_MC_Config_renderer.tst

// Multi-channel 7_1_4 at 512 kbps, 48kHz in, 48kHz out, BINAURAL_REVERB out Config renderer
../IVAS_cod -mc 7_1_4 512000 48 testv/stv714MC48c.wav bit
../IVAS_dec -render_config testv/rend_config_renderer.dat BINAURAL_REVERB 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst
../IVAS_dec -render_config testv/rend_config_renderer.cfg BINAURAL_REVERB 48 bit testv/stv714MC48c.wav_MC714_512000_48-48_MC_Config_renderer.tst

// Multi-channel 5_1 bitrate switching from 13.2 kbps to 512 kbps, 48kHz in, 48kHz out, 7_1_4 out
../IVAS_cod -mc 5_1 ../scripts/switchPaths/sw_mctech_5fr.bin 48 testv/stv51MC48c.wav bit
Loading